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