У меня есть два класса 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
имеет неизменяемую семантику, но его внутренние элементы изменяемы (например, hashCode
в java.lang.String
).
Когда я вызываю getB()
из двух разных потоков, и вызовы перекрываются, я предполагаю, что каждый поток получает свой собственный экземпляр B
. Но поскольку конструктор B
получает только неизменяемые данные, два экземпляра B
должны быть равны.
Это правильно? Если нет, должен ли я сделать getB()
синхронизированным, чтобы сделать его потокобезопасным?
Предположим, что B реализует equals(), который сравнивает все переменные экземпляра B. То же самое для hashCode()
B
переопределяетequals
? - person Mark Elliot   schedule 10.03.2014getB()
одновременно, может случиться так, что каждый поток имеет свой собственный объектB
, или также может случиться так, что они оба используют один и тот жеB
. Вопрос здесь такой же, как указывает @MarkElliot:B
переопределяетequals()
иhashCode()
? - person morgano   schedule 10.03.2014B
реализуетequals()
, который сравнивает все переменные экземпляраB
. То же самое дляhashCode()
. - person Christoph Walesch   schedule 10.03.2014