Java Параллелизм на практике имеет следующий пример:Понимание JVM гарантии неизменных объектов
@ThreadSafe
public class VolatileCachedFactorizer implements Servlet {
private volatile OneValueCache cache = new OneValueCache(null, null);
public void service(ServletRequest req, ServletResponse resp) {
BigInteger i = extractFromRequest(req);
BigInteger[] factors = cache.getFactors(i);
if (factors == null) {
factors = factor(i);
cache = new OneValueCache(i, factors);
}
encodeIntoResponse(resp, factors);
}
}
}
OneValueCache
является непреложным.
Из того, что я понимаю, используя volatile
, обеспечивается, чтобы все потоки отображали актуальную ссылку, хранящуюся в переменной cache
.
В то же время он говорит, что
Неизменные объекты могут безопасно использоваться любым потоком без дополнительной синхронизации, даже если синхронизация не используется для публикации их.
Для меня это говорит о том, что мы фактически не нуждаемся в том, чтобы volatile
выше, чем мы использовали для синхронизации.
JLS
также имеет следующий пример:
class FinalFieldExample {
final int x;
int y;
static FinalFieldExample f;
public FinalFieldExample() {
x = 3;
y = 4;
}
static void writer() {
f = new FinalFieldExample();
}
static void reader() {
if (f != null) {
int i = f.x; // guaranteed to see 3
int j = f.y; // could see 0
}
}
}
Они не используют volatile
для поля f
. Разве это не означает, что другие потоки могут видеть f
как null
и никогда не видеть созданный экземпляр?
Может ли кто-нибудь объяснить?
Объект неизменен, переменная нет. – OrangeDog
Вы объединяете две очень разные вещи: - Объект, если он обозначен как неизменный, является потокобезопасным. - переменная (относящаяся к объекту) открыта для указания на любой другой объект, поэтому потребность в ключевом слове 'volatile' для обеспечения того, чтобы какой-либо компонент использовал переменную, имеет доступ к последней копии того, что относится к переменной to – kolossus
Что меня смутило: «Неизменяемые объекты могут быть опубликованы с помощью любого механизма». Назначение переменной - это механизм, но это не было бы поточно-безопасным для этого, верно? – damluar