Volatile的内存语义
Volatile的内存语义
可见性:对于一个volatile变量的读,总能看见任意线程对volatile变量最后的写。
原子性:对于任意单个volatile变量的读写具有原子性,但对于符合操作不具有原子性。
当写volatile变量时,jvm会把线程中对用的本地存贮刷新到内存。
读取volatile变量时,jvm会把本地存贮的值置为无效,读取内存中的值。
Volatile内存语义的实现
StoreStore屏障 volatile写操作 StoreLoad屏障
Volatile写操作 LoadLoad屏障 LoadStore屏障
锁的内存语义
锁的内存语义
释放锁的时候,jvm把线程本地存贮刷新到内存中。
获取锁的时候,jvm会把线程对应的本地内存置为无效,而迫使被监视器保护的临界区代码必须从主内存中读取共享变量。
锁内存语义的实现
1>利用volatile变量的读写内存语义
2>利用cas所附带的volatile读和volatile写的内存语义。
ps:cas同时具有volatile读-写的内存语义。
Final域的内存语义
对于final域,编译器和处理器要遵守两个重排序规则。
1,对于构造函数对final域的写入,在随后这个被构造的对象的引用赋值给一个引用变量,这两个操作之间不能重排序。
2,初次读取一个包含final域的对象的引用,于随后初次读取这个final域,这两个操作之间不能重排序。