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

Ton*_*ony 1 java multithreading synchronization thread-safety

假设我有这个课程:

class Zoo
{
    protected String bearName;
    protected Double trainerSalary;
    protected Integer monkeyCount;
}
Run Code Online (Sandbox Code Playgroud)

一个线程可以写入这些字段,而另一个线程可以读取它们而无需synchronized访问该Zoo对象吗?

注意:这些值可以彼此分开处理,因此trainerSalarymonkeyCount读取时更改它们并不重要.

编辑:

只是为了澄清,这些领域是可变的 ; 只有他们引用的对象是不可变的.

Ste*_*Kuo 6

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

一本关于此的好书是Java Concurrency in Practice.