volatile保证可见性?
不同的线程操作的对象的属性时, 如果set方法需要加锁,那为什么get需要给属性值加volatile,保证其可见性, 我理解的是如果不同线程操作对象应该是同一个对象,既然是同一个对象,这个对象就是属性值是可以获取到的不需要加volatile关键字,我在提问这个问题的时候突然想到JMM规范,是不是因为JMM规范,需要加载到线程自己的本地内存,然后再更新到主内存中,volatile是保证在本地内存时就可以让其他的线程就能访问到呢
回答:
本地内存你可以理解为cpu中的缓存,比如有一台两个cpu的机器,当两个线程(分别对应两个cpu)访问同一个对象时,这个对象可能已经被缓存在不同cpu的缓存中。如果没有用volatile修饰,当某个线程执行完set之后,数据更新到当前这个cpu的缓存中,这时另一个cpu中的缓存并没有发生改变,直接读取则还是读的缓存中的旧数据。
而volatile关键字可以让更新立马刷新回主存,并且使其他cpu缓存中对应的数据失效
,使其他线程只能从主存中来读取数据,这时候读取到的就是最新的数据
以上是 volatile保证可见性? 的全部内容, 来源链接: utcz.com/p/944830.html