Примечание от The Java Параллелизма В практикенеизменных объектов и инициализация безопасность с ниточным
Неизменные объекты могут безопасно использоваться любым потоком без дополнительной синхронизации, даже если синхронизация не используются для публикации их
Получаю, что они нить - сейф.
Отрывок из Джереми Мэнсона блог-
class String {
// Don't do this, either.
static String lastConstructed;
private final byte[] bytes;
public String(byte[] value) {
bytes = new byte[value.length];
System.arraycopy(value, 0, bytes, 0, value.length);
lastConstructed = this;
}
}
Поскольку эта ссылка хранится в lastConstructed ", следовательно, Спасаясь конструктор
Ofcourse, он будет работать, если вы сделали lastConstructed летучий (postJDK5 + семантика)
Один из вопросов, заданных здесь, -
Если lastConstructed был изменчивым, но тогда ссылка была небезопасной , опубликованной в другой поток, то строка не будет неизменной. Справа?
, к которому ответ Джереми was-
Это не будет поточно-потому, что он был неизменен, но было бы потокобезопасной потому lastConstructed была нестабильной.
Я прекрасно понимаю, что он был бы потокобезопасным, потому что lastConstructed был изменчивым, но я не получаю Он не был бы потокобезопасным, потому что он был неизменным.
Почему? В записке от Concurrency In Practice говорится, что неизменяемые объекты могут безопасно использоваться любым потоком (например, гарантия безопасности потока). Если что-то неизменное, то это поточно-безопасное.
Просьба предложить.
Вы не можете опубликовать ссылку на объект и ожидать, что он будет использоваться или иметь какое-либо отношение к полю 'static'. –
Возможно, он означает, что только сама неизменяемость не гарантирует безопасность потоков (поэтому, если у вас есть статические поля, которые являются общими для всех объектов класса, вам необходимо сделать их неустойчивыми) –