【java进阶】- 多线程-内存可见性

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关键字也可以保证内存可见性.

猜你喜欢

转载自blog.csdn.net/lovexiaotaozi/article/details/81359365