来源丨小白法式之路
juejin.im/post/5c7dfc925188251b8c769f69
原 子 性原子性指的是一个或者多个操做在 CPU 施行的过程中不被中断的特征
线程切换 带来的原子性问题
Java 并发法式都是基于多线程的,操做系统为了充实操纵CPU的资本,将CPU分红若干个时间片,在多线程情况下,线程会被操做系统调度停止使命切换。
为了曲不雅的领会什么是原子性,我们看下下面哪些操做是原子性操做
int count = 0; //1count++; //2int a = count; //3上面展现语句中,除了语句1是原子操做,其它两个语句都不是原子性操做,下面我们来阐发一下语句2
其实语句2在施行的时候,包罗三个指令操做
指令 1:起首,需要把变量 count 从内存加载到 CPU的存放器
指令 2:之后,在存放器中施行 +1 操做;
指令 3:最初,将成果写入内存
关于上面的三条指令来说,若是线程 A 在指令 1 施行完后做线程切换,线程 A 和线程 B 根据下图的序列施行,那么我们会发现两个线程都施行了 count+=1 的操做,但是得到的成果不是我们期望的 2,而是 1。
操做系统做使命切换,能够发作在任何一条CPU 指令施行完
有 序 性有序性指的是法式根据代码的先后挨次施行
编译优化会带来的有序性问题
为了性能优化,编译器和处置器会停止指令重排序,有时候会改动法式中语句的先后挨次,好比法式:
a = 5; //1b = 20; //2c = a + b; //3编译器优化后可能酿成:
b = 20; //1a = 5; //2c = a + b; //3在那个例子中,编译器调整了语句的挨次,但是不影响法式的最末成果
synchronized(具有有序性、原子性、可见性)暗示锁在统一时刻只能由一个线程停止获取,当锁被占用后,其他线程只能期待。
在单例形式的实现上有一种双重查验锁定的体例(Double-checked Locking)
public class Singleton { static Singleton instance; static Singleton getInstance(){ if (instance == null) { synchronized(Singleton.class) { if (instance == null) instance = new Singleton(); } } return instance; }}我们先看 instance=newSingleton() 的未被编译器优化的操做
指令 1:分配一块内存 M;
指令 2:在内存 M 上初始化 Singleton 对象;
指令 3:然后 M 的地址赋值给 instance 变量。
编译器优化后的操做指令
指令 1:分配一块内存 M;
指令 2:将 M 的地址赋值给 instance 变量;
指令 3:然后在内存 M 上初始化 Singleton 对象。
如今有A,B两个线程,我们假设线程A先施行getInstance()办法,当施行编译器优化后的操做指令2时(此时候未完成对象的初始化),那时候发作了线程切换,那么线程B进入,刚好施行到第一次判断 instance==null会发现instance不等于null了,所以间接返回instance,而此时的 instance 是没有初始化过的。
现行的比力通用的做法就是接纳静态内部类的体例来实现
public class SingletonDemo { private SingletonDemo() { } private static class SingletonDemoHandler{ private static SingletonDemo instance = new SingletonDemo(); } public static SingletonDemo getInstance() { return SingletonDemoHandler.instance; }}可 见 性可见性指的是当一个线程修改了共享变量后,其他线程可以立即得知那个修改
缓存 招致的可见性问题
起首我们来看一下Java内存模子(JMM)
我们定义的所有变量都贮存在主内存中
每个线程都有本身独立的工做内存,里面保留该线程利用到的变量的副本(主内存中该变量的一份拷贝)
线程对共享变量所有的操做都必需在本身的工做内存中停止,不克不及间接从主内存中读写(不克不及越级)
差别线程之间也无法间接拜候其他线程的工做内存中的变量,线程间变量值的传递需要通过主内存来停止。(同级不克不及彼此拜候)
共享变量可见性的实现原理:
线程1对共享变量的修改要被线程2及时看到的话,要颠末如下步调:
把工做内存1中更新的变量值刷新到主内存
把主内存中的变量的值更新到工做内存2中
能够利用 synchronized 、volatile 、final 来包管可见性










还没有评论,来说两句吧...