一、几个重要的概念
1.原子性:提供互斥访问,同一时间只能有一个线程来对他进行操作
2.可见性:一个线程对主内存的修改可以及时被其他线程观察到
3.有序性:一个线程观察其他宣称中的指令执行顺序,由于指令重新排序的存在,该观察结果一般杂乱无序
二、volatile和synchronized的区别与联系
1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住;
2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的;
3.volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性;
4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞;
5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。
三、volatile:
对volatile变量进行写操作时候,会在操作后加入一条store屏障指令,将本地内存中的共享变量值刷新到主内存。
对volatile变量进行读操作时候,会在操作前加入一条store屏障指令,从主内存中读取共享变量。
四、有序性 happens-before 原则
java 内存模型中,允许编译器和处理器对指令进行重新排序,重排序不会影响单线程的执行却会影响多线程并发执行的正确性
volatile synchronized lock
happens-before 原则
程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作
volatile变量规则:对一个变量的写操作先发生于后面对这个变量的读操作
传递规则:a-b-c 执行具有传递性
线程启动规则: Thread对象的start()方法现行发生于次线程的每一个动作。
线程中断规则: 对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生。
线程终结规则:线程中的所有操作都先于线程的终止操纵,我们可以通过Thread.jion()方法结束,Thread.isAlive()的返回值手段检测线程已经终止执行。
对象终结规则:一个对象的初始化完成现行发生于他的finalize()方法的开始。
五、安全发布对象
1.发布对象:使一个对象能够被当前范围之外的代码使用
(1)在静态初始化函数中初始化一个对象的引用
(2)讲对象的引用保存到volatile类型域或者AtomicReference对象中
(3)将对象的引用保存到某个正确构造对象的final类型域中
(4)将对象的引用保存到一个由锁保护的域中
双重检测锁且限制指令重排2.对象逸出:一种错误的发布。当一个对象还没构造完成时候,就使用它被其他线程所见。
六、不可变对象
1.对象创建以后其状态就不能修改(final 修饰类,方法,变量)
Collections.unmodifableMap(clz) 对象不可修改
2.对象所有域都是final 类型
3.对象是正确创建(对象创建期间,this引用没有逸出)
网友评论