Поскольку clone () намного дороже, чем синхронизированный, это вряд ли имеет значение с точки зрения производительности.
Тем не менее, второй пример безопасен для потоков и незначительно быстрее.
единственное отличие состоит в том, что в первом примере вы можете сделать это.(Нравится вам это или нет;)
synchronized(theHolder) {
SomeMutableData smd = theHolder.cloneData();
smd.updateIt();
theHolder.storeData(smd);
}
КСТАТИ: я не думаю, что держатель должен расширять тип, который он упаковывает.
РЕДАКТИРОВАТЬ: более дружественный способ GC заключается вИспользуйте следующий подход.Вы можете написать copyFrom () таким образом, чтобы объекты не создавались ни для установки, ни для получения данных.
public final class ThreadSafeHolder {
private final SomeMutableData data = new SomeMutableData();
public ThreadSafeHolder(SomeMutableData data) {
copyFrom(data);
}
public synchronized void copyTo(SomeMutableData data) {
data.copyFrom(this.data);
}
public synchronized void copyFrom(SomeMutableData data) {
this.data.copyFrom(data);
}
}