@acm Личное общение.
ге Java Concurrency in Practice вы можете найти следующий код:
@ThreadSafe
public class SafePoint {
@GuardedBy("this") private int x, y;
private SafePoint(int[] a) { this(a[0], a[1]); }
public SafePoint(SafePoint p) { this(p.get()); }
public SafePoint(int x, int y) {
this.x = x;
this.y = y;
}
public synchronized int[] get() { return new int[] { x, y };
}
public synchronized void set(int x, int y) { this.x = x;
this.y = y;
}
}
Это помечено как@ThreadSafe
.
Я уверен, что этот класс не является потокобезопасным (если я правильно понимаю этот термин).
Пример:
SafePoint racePublishedSafePoint; // field
// thread 1:
racePublishedSafePoint = new SafePoint(1,1);
// thread 2:
SafePoint sp;
while(true){
SafePoint sp = racePublishedSafePoint;
if(sp != null) break;
}
System.out.println(sp.get()[0]);
System.out.println(sp.get()[1]);
Я считаю, что есть несколько возможных результатов:
Приложение не заканчиваетсяещеЕсли приложение завершено, мы можем увидеть
а) 0 0
б) 0 1
в) 1 0
г) 1 1
Я прав?
Если это правда, почему автор пометил класс как потокобезопасный? Я думал, что потокобезопасный класс - класс, который можно использовать в параллельном приложении без сложного анализа.
Что хотел сказать автор?
ПостскриптумЯ прочиталЧастный конструктор, чтобы избежать гонки
... и моя тема не дублируется.