Java教程

多线程中本地内存刷新到主存中的时机

本文主要是介绍多线程中本地内存刷新到主存中的时机,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

转:https://blog.csdn.net/weixin_43170684/article/details/113947494

结论:保证可见性的方法:

1.volatile

2.synchronized

3.juc的显示锁lock

  --注意:在juc的并发集合中也用到了synchronized或者lock,因此这些并发集合也能保证可见性,或者理解为 线程安全 包括了可见性

*****在多线程的环境下,如果某个线程首次读取共享变量,则首先到主内存中获取该变量,然后存入工作内存中,以后只需要在工作内存中读取该变量即可。同样如果对该变量执行了修改的操作,则先将新值写入工作内存中,然后再刷新至主内存中。但是什么时候最新的值会被刷新至主内存中是不太确定的,这也就解释了为什么VolatileFoo中的Reader线程始终无法获取到init_value最新的变化。

*****使用关键字volatile,当一个变量被volatile关键字修饰时,对于共享资源的读操作会直接在主内存中进行(当然也会缓存到工作内存中,当其他线程对该共享资源进行了修改,则会导致当前线程在工作内存中的共享资源失效,所以必须从主内存中再次获取),对于共享资源的写操作当然是先要修改工作内存,但是修改结束后会立刻将其刷新到主内存中。
**** 通过synchronized关键字能够保证可见性,synchronized关键字能够保证同一时刻只有一个线程获得锁,然后执行同步方法,并且还会确保在锁释放之前,会将对变量的修改刷新到主内存当中。
· 通过JUC提供的显式锁Lock也能够保证可见性,Lock的lock方法能够保证在同一时 刻只有一个线程获得锁然后执行同步方法,并且会确保在锁释放(Lock的unlock方法)之前会将对变量的修改刷新到主内存当中。

摘自:《Java高并发编程详解:多线程与架构设计》 — 汪文君

这篇关于多线程中本地内存刷新到主存中的时机的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!