Согласно модели памяти Java, поле final
, инициализированное в конструкторе объекта, не подлежащем дальнейшим изменениям, гарантированно будет правильно видеть его значение каждым потоком, читающим его, даже если сам объект был опубликован с гонками данных .
JLS говорит о 17.5.3 Последующая модификация конечных полей и смутно утверждает, что
Реализация может обеспечить способ выполнения блока кода в окончательном безопасном контексте поля .
Кажется, что он не определяет семантику таких модификаций, и где именно должен существовать этот конечный безопасный для поля контекст или как его определить (т. Е. JLS, похоже, не дает гарантия на последующую модификацию конечных полей).
Я должен сказать, что не полностью понял частичные порядки разыменования () и mc () , а также поведение действия freeze , которое выполняет ставить после любой модификации последнее поле (либо приписанное ему начальное значение, либо последующие модификации).
В этом контексте я хочу знать следующее: как может (de) инфраструктура сериализации, такая как 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)
, и, наконец, они устанавливаются.
И это только в Sun (или совместимых) JVM! Похоже, у Gson есть код, специфичный для нескольких версий Android.
Итак, существуют ли какие-либо гарантии безопасности потока, связанные с этими десериализованными конечными полями , точно так же, как я бы сделал с экземпляром X
, созданным с new X("abc")
? Если да, то откуда берется эта гарантия?
Спасибо!