1.volatile初认识
Volatile 具有可见性和原子性。可见性对于一个volatile变量的读,总是能看到对这个变量最后的写入,原子性对任意单个变量的读写具有原子性,到类似++这种复合操作不具有原子性。
volatile写读建立在happens-before关系上,可以实现线程之间通信。volatile的写-读与锁的释放-获取相同,volatile写与锁的释放对应,读与锁的获取对应。
volatile写时,java并发控制会把该线程对应的本地内存中的变量刷新到主内存中。写线程向其它读线程发送消息。
volatile读时,java内存模型JMM会把本地内存设置为无效,并把主内存的数据读取到本地共享变量中。读线程接受写线程发送的消息。
写线程通过主内存向读线程发送消息实现线程之间通信。
2.volatile内存语义实现
重排序是为了提高性能,编译器和处理器会对相应的指令做重排序。分为编译器优化重排序,指令级并行重排序,内存系统重排序。
当第二个操作是volatile写时,不管前面是什么操作都不能重排序,这个规则确保了volatile写之前的操作都不能被编译器重排序到volatile写之后。
当第一个操作为volatile读时,不管后面是操作都不能重排序。这个规则确保volatile读之后的操作不会被编译器优化重排序到volatile读之前。
当一个操作为写时,第二个为读不能重排序。
编译器采用内存屏障来禁止重排序。
网友评论