JAVA 并发编程之四:Java内存模型+ 线程安全:Atomic(原子性)+Violate(可见性)+有序性+synchronized

前言:

线程安全:提到线程安全,可能大家的第一反应是要确保接口对共享变量的操作要具体原子性。实际上,在多线程编程中我们需要同时关注可见性、顺序性和原子性问题。

原子性:Atomic|synchronized 可保证;Atomic实现CAS(乐观锁),synchronized为悲观锁;

可见性:Violate|synchronized 可保证;

有序性:Violate 可部分保证(禁止指令重排序),synchronized 可保证。

结论:synchronized同步代码块可保证线程安全(原子性+可见性+有序性)。

 

Java内存模型

想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的。

JAVA 并发编程之四:Java内存模型+ 线程安全:Atomic(原子性)+Violate(可见性)+有序性+synchronized_第1张图片

Java内存模型规定了所有的变量都存储在主内存中。每条线程中还有自己的工作内存,线程的工作内存中保存了被该线程所使用到的变量(这些变量是从主内存中拷贝而来)。线程对变量的所有操作(读取,赋值)都必须在工作内存中进行。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

基于此种内存模型,便产生了多线程编程中的数据“脏读”等问题。

举个简单的例子:在java中,执行下面这个语句:

i  = 10;
i++;
i++;
执行线程必须先在自己的工作线程中对变量i所在的缓存行进行赋值操作,然后再写入主存当中。而不是直接将数值10写入主存当中。

比如同时有2个线程执行这段代码,假如初始时i的值为10,那么我们希望两个线程执

你可能感兴趣的:(Java,并发编程,Java,并发编程)