标签:串行 虚拟机 处理 ola 针对 初始化 变量 工作 restore
线程之间的通信机制有两种:共享内存和消息传递。Java的并发采用的是隐式的共享内存模型。
Java内存模型(JMM)是围绕着在并发过程中如何处理原子性、可见性和有序性来建立的。
在执行程序时,编译器和处理器会对指令重排序,重排序分三种类型:
JMM把内存屏障指令分为四类:
在JMM中,如果一个操作执行的结果需要对另一个操作可见,这两个操作之间必须存在happens-before关系。
happens-before规则仅仅要求前一个操作的结果对后一个操作可见,且前一个操作按顺序排在第二个操作之前。
对一个volatile共享变量的单个读写操作,相当于对普通共享变量的读写操作使用同一个锁来同步。
volatile保证了多线程操作变量的可见性(新值能立即同步到主内存,每次使用前立即从主内存刷新)和有序性(volatile本身就包含了禁止指令重排序的语义),但不能保证原子性(对任意单个volatile变量的读写具有原子性,但对于volatile++这种复合操作不具有原子性)。
锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。
ReentrantLock的实现依赖于Java同步框架AQS,AQS使用一个整型的volatile变量state来维护同步状态。
锁释放和获取的内存语义的实现使用了volatile变量的读写所具有的内存语义和CAS自带的volatile读写的语义。
final保证了可见性(被final修饰的字段在构造器中一旦初始化完成,并且构造器没有把this的引用传递出去,那在其他线程中就能看见final的值)。
《深入理解Java内存模型》、《深入理解Java虚拟机 第二版》
标签:串行 虚拟机 处理 ola 针对 初始化 变量 工作 restore
原文地址:https://www.cnblogs.com/pycrab/p/9732225.html