【发布时间】:2011-04-29 21:58:13
【问题描述】:
假设我有这个课程:
class Zoo
{
protected String bearName;
protected Double trainerSalary;
protected Integer monkeyCount;
}
可以一个线程写入这些字段,另一个线程读取它们,而不需要synchronized 访问Zoo 对象吗?
注意:这些值可以彼此分开处理,因此在读取monkeyCount 时更改trainerSalary 并不重要。
编辑:
澄清一下,这些字段是可变的;只有它们引用的对象是不可变的。
【问题讨论】:
-
是什么让这些值“不可变”?如果你可以写信给他们,他们需要通过某种形式的同步来保护。
-
@Rodney Gitzel:我认为这意味着 objects 本身是不可变的。您不能保留对
String的引用并更改内容(您需要创建一个新对象)。 -
@Rodney Gitzel String、Double 和 Integer 在 Java 中都是不可变类型。做任何改变它们的工作只会返回一个新对象。
-
Zoo 在其字段中使用不可变对象并不重要。这并不能使 Zoo 不可变。不变性意味着一旦创建,您将不会更改 Zoo 中的任何内容。现在,如果 Zoo 真的是不可变的,那么您的问题的答案是“不,您不需要同步对 Zoo 的访问”。
标签: java multithreading synchronization thread-safety