线程安全

单例模式

江枫思渺然 提交于 2019-12-04 03:55:22
单例模式:某个类只能有一个实例,提供一个全局的访问点。 单例模式 ●核心作用:保证一个类只有一个实例,并且提供一一个访问该实例的全局访问点。 ●常见应用场景: 一Windows的Task Manager (任务管理器)就是很典型的单例模式 windows的Recycle Bin (回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。 项目中,读取配置文件的类,一般也只有一 个对象。 没有必要每次使用配置文件数据,每次new-个对象去读取。 网站的计数器,一般也是 采用单例模式实现,否则难以同步。 -应用程序的日志应用 , -般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作 , 否则内容不好追加。 数据库连接池的设计-般也是采用单例模式 ,因为数据库连接是一种数据库资源。 -操作系统的文件系统 ,也是大的单例模式实现的具体例子,-个操作系统只能有一个文件系统。 Application也是单例的典型应用( Servlet编程中会涉及到) -在Spring中 ,每个Bean默认就是单例的,这样做的优点是Spring容器可以管理 -在servlet编程中 ,每个Servlet也是单例 -在spring MVC框架/struts1框架中,控制器对象也是单例 ●单例模式的优点: -由于单例模式只生成一 个实例

正确使用 Volatile

只谈情不闲聊 提交于 2019-12-03 22:25:14
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized ”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。 锁提供了两种主要特性: 互斥(mutual exclusion) 和 可见性(visibility) 。互斥即一次 只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些, 它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。 Volatile 变量 Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器

JAVA【Volidate与锁机制】

怎甘沉沦 提交于 2019-12-03 22:24:52
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized ”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。 锁提供了两种主要特性: 互斥(mutual exclusion) 和 可见性(visibility) 。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。 Volatile 变量 Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器

有状态对象和状态对象

倾然丶 夕夏残阳落幕 提交于 2019-12-03 22:16:03
本博客转自: https://blog.csdn.net/eff666/article/details/52495393 有状态就是有 数据存储功能 。有状态对象(Stateful Bean),就是 有实例变量的对象 ,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态 。其实就是有数据成员的对象 。 无状态就是一次操作, 不能保存数据 。无状态对象(Stateless Bean),就是没有实例变量的对象。不能保存数据,是不变类,是线程安全的。 具体来说就是只有方法没有数据成员的对象,或者有数据成员但是数据成员是可读的对象。 来源: CSDN 作者: cpc q:2531249502 链接: https://blog.csdn.net/qq_43059674/article/details/88718650

有状态和无状态的区别

爷,独闯天下 提交于 2019-12-03 22:14:55
基本概念: 有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。 无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象 .不能保存数据,是不变类,是线程安全的。 代码更好理解: Java代码 public class StatefulBean { public int state; // 由于多线程环境下,user是引用对象,是非线程安全的 public User user; public int getState() { return state; } public void setState( int state) { this .state = state; } public User getUser() { return user; } public void setUser(User user) { this .user = user; } } public class StatelessBeanService { // 虽然有billDao属性,但billDao是没有状态信息的,是Stateless Bean. BillDao billDao; public BillDao getBillDao() { return

有状态对象和无状态对象

巧了我就是萌 提交于 2019-12-03 22:13:24
1、线程安全   要搞清楚有状态对象和无状态对象,首先需要弄清楚线程安全的问题。如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,那么就是线程安全的。   或者说,一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。   线程安全问题都是由全局变量及静态变量引起的。 若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。 2、关于线程安全 1) 常量始终是线程安全的,因为只存在读操作。 2) 每次调用方法前都新建一个实例是线程安全的,因为不会访问共享的资源(共享堆内存)。 3) 局部变量是线程安全的。因为每执行一个方法,都会在独立的空间创建局部变量,它不是共享的资源。局部变量包括方法的参数变量和方法内变量。 3、有状态和无状态对象   有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。其实就是有数据成员的对象。   无状态就是一次操作,不能保存数据。无状态对象

多线程之无状态对象和有状态对象

馋奶兔 提交于 2019-12-03 22:12:55
从网上搜到的信息, 有状态对象就是有数据存储功能的对象。无状态对象就是没有数据存储功能的对象。通俗地讲,有状态对象就是有成员变量的对象。 1、无状态对象一定是线程安全的 无状态对象因为不包含任何域,也不包含任何对其他类中域的引用,计算过程中的临时状态仅存在于线程栈的局部变量中,并且只能由正在执行的线程访问,当前线程不会影响到其他正在运行的线程,所以无状态对象一定是线程安全的。 2、有状态对象不一定是线程不安全的 (1)对象成员变量没有被操作: public class StatefulBean { public int status; public int getStatus() { return status; } public void test(){ System.out.println("此方法不操作成员变量status"); } } 上述代码中,虽然StatefulBean类有、成员变量status,但是因为该类中的方法没有操作该成员变量,所以即使该类的对象存在成员变量,也没有线程安全。 (2)成员变量是无状态对象的话,该对象也是线程安全的 public class StatefulTest { public static void main(String[] args) throws Exception { Value value = new Value();

JavaWeb三大组件之Servlet

别说谁变了你拦得住时间么 提交于 2019-12-03 21:07:06
在JavaWeb中有三大组件,分别是Servlet、Filter和Listener。其中Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,即接收请求数据、处理请求和完成响应。   1. 实现Servlet的方式   主要有三种实现方式:1)实现javax.servlet.Servlet接口;2)继承javax.servlet.GenericServlet类;3)继承javax.servlet.http.HttpServlet类;其中最常用的继承HttpServlet类来实现。   2. 关于Servlet接口 1 public interface Servlet { 2 3 public void init(ServletConfig config) throws ServletException; 4 5 public ServletConfig getServletConfig(); 6 7 public void service(ServletRequest req, ServletResponse res) 8 9 throws ServletException, IOException; 10 11 public String getServletInfo(); 12 13 public void destroy(); 14 15 }  

List、Map、Set的区别与联系

扶醉桌前 提交于 2019-12-03 20:38:01
List、Map、Set的区别与联系 一、结构特点 List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合; List中存储的数据是有顺序的,并且值允许重复;Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;Set中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的hashcode决定,即位置是固定的(Set集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)。 二、实现类 List接口有三个实现类: 1.1 LinkedList 基于链表实现,链表内存是散列的,增删快,查找慢; 1.2 ArrayList 基于数组实现,非线程安全,效率高,增删慢,查找快; 1.3 Vector 基于数组实现,线程安全,效率低,增删慢,查找慢; Map接口有四个实现类: 2.1 HashMap 基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null 键; 2.2 HashTable 线程安全,低效,不支持 null 值和 null 键; 2.3 LinkedHashMap 是 HashMap 的一个子类,保存了记录的插入顺序; 2.4 SortMap 接口 TreeMap,能够把它保存的记录根据键排序,默认是键值的升序排序

并发编程71道

不羁岁月 提交于 2019-12-03 16:55:41
转 https://www.cnblogs.com/lfs2640666960/p/11488629.html 金九银十跳槽季已经开始,作为 Java 开发者你开始刷面试题了吗?别急,我整理了71道并发相关的面试题,看这一文就够了! 1、在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User)。 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。Thread.setDaemon()必须在Thread.start()之前调用,否则运行时会抛出异常。 两者的区别: 虚拟机(JVM)何时离开,Daemon是为其他线程提供服务,如果全部的User Thread已经撤离,Daemon 没有可服务的线程,JVM撤离。也可以理解为守护线程是JVM自动创建的线程(但不一定),用户线程是程序创建的线程;比如JVM的垃圾回收线程是一个守护线程,当所有线程已经撤离,不再产生垃圾,守护线程自然就没事可干了,当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。 扩展:Thread Dump打印出来的线程信息,含有daemon字样的线程即为守护进程,可能会有:服务守护进程、编译守护进程、windows下的监听Ctrl