1.可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到.
共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量.
通过上图不难得出以下结论:
线程对共享变量的所有操作都必须在自己的工作内存中进行,不能直接从主线程中读写.
不同的线程之间无法直接访问其他线程工作内存中的变量,线程间变量值的传递需要通过主内存来完成.
2.synchronized实现可见性.
3.volatile实现内存可见性
对volatile变量进行读写操作时,会对在读写之前对线程的内存做刷新操作,强制将主内存/线程工作内存 中的数据拉取/刷新至线程工作内存/主内存中.
volatile不能保证变量复合操作的原子性.
比如先定义一个变量Num: private int num=0;
num++; (并不是原子操作)实际上是三步操作组成: 读取num值,对num++,写入最新num值. 如果用volatile对其修饰,显然不能满足原子操作的需求,只能用synchronized(this){num++};才能保证原子性操作.
4.synchronized和volatile对比
synchronized需要加锁,而volatile并不需要,volatile不会造成线程阻塞,因此在效率上volatile更高,更轻量级.
synchronized既能保证内存可见性,又能保证原子性.
final关键字也可以保证内存可见性.