【发布时间】:2014-03-09 23:42:55
【问题描述】:
我有两个班级A 和B:
class A {
private final String someData;
private B b;
public String getSomeData() { return someData; }
public B getB() {
if (b == null) {
b = new B(someData);
}
return b;
}
}
其中B 是不可变的,并且仅从A 的实例计算其数据。 A 具有不可变的语义,但它的内部是可变的(如 java.lang.String 中的 hashCode)。
当我从两个不同的线程调用getB(),并且调用重叠时,我假设每个线程都有自己的B 实例。但是由于B的构造函数只获取不可变数据,所以B的两个实例应该相等。
正确吗?如果不是,我必须让getB() 同步以使其成为线程安全的吗?
假设B实现equals(),比较B的所有实例变量。hashCode()也一样
【问题讨论】:
-
B是否覆盖equals? -
当两个线程同时调用
getB()时,可能会发生每个线程都有自己的对象B,或者它们也可能共享相同的B。这里的问题就像@MarkElliot 指出的那样:B是否覆盖equals()和hashCode()? -
@MarkElliot 是的,假设
B实现equals(),它比较B的所有实例变量。hashCode()也一样。
标签: java multithreading thread-safety immutability lazy-initialization