java - 同步不同的对象可见性
问题描述
以下代码显示了与此不同的对象上的同步:
public class A {
int a,b,c,d;
public void method1(Object x){
synchronized(x){
// is a ,b ,c ,d guarantee visibility ?
}
}
public synchronized void method2() {
a++;
}
}
我知道在方法 1 和方法 2 中具有不同的锁定来编辑 a 、 b 、 c 、 d 会有问题,但问题是方法 2 刷新的更改对方法 1 是可见的吗?因为他们不使用相同的锁。
解决方案
如果您只读取a
, 在 x64 上这将发生,因为内存屏障不限于特定的内存位置。但是,我的理解是 Java 不保证这将是线程安全的,因为锁适用于不同的对象。当然,如果你a
在第一个方法中递增,它就不是线程安全的。
推荐阅读
- php - 我如何将删除xampp密码更改为无密码?
- javascript - React 中哪种方法更好?
- javascript - Rails 使用带有acts_as_votable 的Ajax 支持/反对
- laravel - 在 laravel 中实现存储库模式的官方方法
- ckan - 在 CKAN 中创建标准用户作为系统管理员
- java - 如何为 AndroidX 测试配置 Android 项目
- varnish-vcl - 如何在清漆中使用正则表达式从长度未定义的字符串中提取 n 个字符?
- php - 在 Laravel 项目中创建密码哈希
- ruby - 工厂女孩和 mongoid 的问题
- java - 我想显示来自drawable的图像并将其与来自json-api的数据结合到recylerview