Согласно модели памяти Java, поле final
, инициализированное в конструкторе объекта, не подлежащее дальнейшим изменениям, гарантированно будет иметь его значение, правильно видимое каждым потоком, читающим его, даже если сам объект был опубликован с гонками данных.
В JLS говорится о 17.5.3 Последующее изменение окончательной версии Поля и неопределенно заявляет, что
Реализация может предоставить способ выполнения блока кода в безопасном для поля контексте.
Похоже, что на самом деле он не определяет ни семантику таких модификаций, ни то, где именно этот безопасный для поля контекст должен существовать, или как его определить (т. Е. JLS, похоже, не дает никаких гарантий относительно последующая модификация финальных полей).
Должен сказать, что я не полностью понял ни частичные порядки dereferences () и mc (), ни поведение действия замораживания, которое принимает ставить после любого изменения последнего поля (либо начального значения, присвоенного ему, либо последующих модификаций).
В этом контексте я хочу знать следующее: как может структура (де) сериализации, такая как Gson, гарантировать, что десериализованные объекты, содержащие конечные поля, правильно инициализированные в конструкторе, не будут создавать проблем с видимостью потока?
Например, рассмотрим этот класс:
class X {
private final String s;
public X(final String s) { this.s = s; }
@Override public String toString() { return s; }
}
И следующий код:
final Gson gson = new Gson();
X x = gson.fromJson(gson.toJson(new X("abc")), X.class);
System.out.println(x);
// prints abc
Перейдя к методу fromJson
с отладчиком, я вижу, что sun.misc.Unsafe
используется для выделения экземпляра X
без вызова его конструктора, а поля равны setAccessible(true)
, и, наконец, они устанавливаются.
И это только в JVM Sun (или совместимых)! Похоже, что у Gson есть код, специфичный для нескольких версий Android.
Итак, есть ли какие-либо гарантии безопасности потоков, связанные с этими десериализованными конечными полями, как я бы сделал с экземпляром X
, созданным с помощью new X("abc")
? Если да, то откуда взялась эта гарантия?
Спасибо!