假设我有这个课程:
class Zoo { protected String bearName; protected Double trainerSalary; protected Integer monkeyCount; }
一个线程可以在不synchronized访问该Zoo对象的情况下写入这些字段,而另一个线程可以读取它们吗?
synchronized
Zoo
注意:这些值可以彼此分开对待,因此trainerSalary在monkeyCount读取时更改没关系。
trainerSalary
monkeyCount
编辑 :
为了澄清起见,这些字段是 可变的 。只有它们引用的对象是 不可变的 。
从技术上讲,你需要让他们final,volatile或读取 和 使用写出来synchronzied,以保证读者会读的最先进的最新值。正如您现在所拥有的,如果一个线程写入一个值,则不能保证另一线程将读取相同的值。这是因为读取线程可能会看到缓存的值。对于多核CPU和各种级别的缓存,这种可能性更大。
final
volatile
synchronzied
关于这方面的一本好书是《Java Concurrency in Practice》。