同步 属性 读取为非同步 属性

Synchronized property reading as non-synchronized property

我有一个非原子java属性,可以通过synchronizedsetter设置。我的问题是,我可以通过非同步 getter 阅读这个 属性 吗?谢谢

如果 属性 不是原子的,您可能需要引入 ReadwriteLock。 参见 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReadWriteLock.html

您可以读取 属性,即线程会看到一些值,但问题是它是不可预测的——它可能无法反映最近的另一个线程写入的值,甚至可能是随机值。因此,您也应该同步 getter。只同步写入变量的方法是不安全的。

您可以通过getter方法读取该值,但您可以获得不可预知的值。 因为您正在从 getter 获取值的运动,所以其他线程可能会调用 setter 方法并更改值。因此,为了避免数据违规,我们应该让 setter 和 getter 都同步,并且它必须在同一个对象锁下被锁定。

答案取决于字段是否可变。

如果该字段不是可变的,那么其他答案都是正确的。您可以读取该值,但是执行读取的线程很多不能 "see" 另一个线程写入的值。写入的值可能在线程本地缓存中,因此第二个线程可能总是看到旧值。此外,JIT 编译器可以自由地以一种只有在没有人同时读取值的情况下才有效的方式重新排序代码。

如果该字段是可变的,那么您将获得所需的行为。 JVM 会保证每个线程都会得到最新的值。

请注意,您不应在同步块之外的可变字段上执行读取-修改-写入操作(如递增整数字段),因为竞争条件会导致意外结果。

有关详细信息,请阅读 Java Concurrency in Practice