В последнее время я читаю несколько книг о параллельности Java. Что касается безопасности потоков, если невозможно сделать класс несовместимым, вы всегда можете обеспечить безопасность потока, синхронизируя его данные.Синхронизированная, летучая и потоковая безопасность
Следующий класс будет явно не поточно
public class NotThreadSafe {
private int value;
public void setValue(int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
}
Тогда я могу синхронизировать записи, но он будет оставаться не Потокобезопасная
public class StillNotThreadSafe {
private int value;
public synchronized void setValue(int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
}
Как я должен был бы синхронизировать не только пишет также, а также чтения
public class ThreadSafe {
private int value;
public synchronized void setValue(int value) {
this.value = value;
}
public synchronized int getValue() {
return this.value;
}
}
Теперь вопрос заключается в том, что с помощью летучих я могу гарантировать, что другие потоки будут видеть обновленное значение, так что это заставляет меня думать, что этот класс должен быть поточно
public class NotSure {
private volatile int value;
public synchronized void setValue(int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
}
Является ли последний класс поточно-??
Предположим, что setValue() делает немного больше, чем это (скажем, 100 значений), и он не завершен в тайм-листе первого потока. Теперь, если второй поток начинает читать, как объявить все переменные как volatile help ?. Как вы сказали, Летучие атомы. Итак, теперь второй поток будет вынужден игнорировать его локальный кеш. Он вынужден получить последнюю ценность. Если вы не используете синхронизацию в этом случае, половина значений, которые обновляются в первом потоке, читаются правильно ?. И мы этого не хотели бы? Поправьте меня, если я ошибаюсь. – TheLostMind
Правильно, я имел в виду 'setValue', как написано в вопросе. Если этот метод сделал больше - если он установил несколько значений или даже написал значение «значение» несколько раз - тогда без 'synchronized', getter (или другой метод) мог бы пройти и прочитать значения, поскольку они находятся на полпути через' setValue 's выполнение, которое, вероятно, было бы плохо. В этот момент все это зависит от конкретных методов, полей, прецедентов/требований и т. Д. – yshavit
Используйте блокировку или синхронизацию на объекте монитора, если операции сложнее. – Radiodef