本文的大部分内容来自慕课网的视频学习,有兴趣的同学可以观看视频细说Java多线程之内存可见性
回顾Java内存模型(JMM)
JMM描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层细节。
其中有两条规定:
1. 线程对共享变量的 所有操作都必须在自己的工作内存中进行,不能直接从主内存中读写
2. 不同线程之间无法直接访问其他线程工作内存中的变量,线程间变量值的传递需要通过主内存来完成
其工作过程大概为:主内存 – 工作内存 – 线程。如下图:
内存可见性
什么是可见性?
1. 可见性:一个线程对共享变量值的改变,能够及时地被其他线程看到。
什么是共享变量?
2. 共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量
实现可见性的原理:
要实现共享变量的可见性,必须保证两点:
(1)线程修改后的共享变量值能够及时从工作内存刷新到主内存中
(2)其他线程能够及时把共享变量的最新值从主内存更新到自己的工作内存中
PS:如果共享变量不可见,则会产生线程不安全的问题。
可见性的实现方式:
Java语言层面支持的可见性实现方式有:synchronized(互斥锁)和volatile