小编典典

我是否需要同步对Java中不可变类型的访问?

java

假设我有这个课程:

class Zoo
{
    protected String bearName;
    protected Double trainerSalary;
    protected Integer monkeyCount;
}

一个线程可以在不synchronized访问该Zoo对象的情况下写入这些字段,而另一个线程可以读取它们吗?

注意:这些值可以彼此分开对待,因此trainerSalarymonkeyCount读取时更改没关系。

编辑

为了澄清起见,这些字段是 可变的 。只有它们引用的对象是 不可变的


阅读 194

收藏
2020-11-30

共1个答案

小编典典

从技术上讲,你需要让他们finalvolatile或读取
使用写出来synchronzied,以保证读者会读的最先进的最新值。正如您现在所拥有的,如果一个线程写入一个值,则不能保证另一线程将读取相同的值。这是因为读取线程可能会看到缓存的值。对于多核CPU和各种级别的缓存,这种可能性更大。

关于这方面的一本好书是《Java Concurrency in Practice》

2020-11-30