Java中synchronized方法的对象参数修改是否保证可见性?
关于synchronized锁下外部对象修改的可见性问题
针对你给出的代码场景,结论是:其他线程使用同一Example对象锁时,对x的修改是保证可见的。
具体解释:
- Java的
synchronized关键字通过锁的释放-获取动作建立happens-before关系。当一个线程释放锁时,它在持有锁期间的所有写操作(包括对传入的外部对象x的成员变量修改)都会被刷新到主内存;当另一个线程获取同一把锁时,会强制失效自己的工作内存,从主内存重新读取所有相关数据。 - 不管修改的是当前Example对象的成员
a,还是外部对象x的value,只要这些修改是在持有锁的方法内完成的,后续获取同一锁的线程就能看到这些修改。
需要注意的边界情况:如果有线程不通过这把Example对象锁,直接访问x.value,那无法保证可见性——可见性的保证只限于通过同一锁的释放-获取流程来传递。
内容的提问来源于stack exchange,提问作者Mohammad Karmi
相关产品推荐
相关产品推荐

