У меня есть переменная, которую мне нужно установить для значения, которое я хочу, чтобы поток был видимым. Я понятия не имею, какой поток выполняет чтение.Неизменяемая многопоточная запись, которая является видимой нитью
Переменная устанавливается только один раз, установив ее как volatile
. Я предотвращаю чтение значения переменной из кэша ЦП (или так я понимаю). Напишите один раз, прочитайте много.
Я не могу получить эту переменную в конструкторе, чтобы использовать final.
Мой грубый поток:
thread 1: set value x
thread 1: fire notification to say x is ready.
thread 2: read x.
Я понимаю, что я могу сделать следующее:
public void setX(int value) {
Object o = new Object();
synchronized(o) {
this.x = value;
}
}
И из-за происходит, прежде чем принцип, то значение будет выписана в память , Это верно?
Что вы пытаетесь достичь снова? возможно, вам просто нужен синглтон – djb
'synchronized (o)' не _happen before_ ничего в вашем примере, потому что 'o' ссылается на другой объект каждый раз, когда вызывается' setX() '. Синхронизация означает только что-либо, когда два или более потоков синхронизируются на _same_-объекте. –
@Cheetah Я понимаю, что поток 2 должен ждать, пока 'x' не будет установлен в потоке 1, однако я хотел бы знать, должен ли поток 1 также ждать, пока поток 2 не захочет читать' x' ... –