У меня есть неатомное свойство java, которое можно установить с помощью синхронизированного установщика. У меня вопрос: могу ли я прочитать это свойство несинхронизированным геттером? Благодарю.

1
jiri463 7 Мар 2015 в 16:57

4 ответа

Лучший ответ

Если свойство не является атомарным, вам, возможно, придется ввести ReadwriteLock. См. http://docs.oracle. com / javase / 7 / docs / api / java / util / concurrent / locks / ReadWriteLock.html

2
GhostCat 7 Мар 2015 в 14:00

Вы можете прочитать значение с помощью метода получения, но вы можете получить непредсказуемое значение. Из-за того, что вы получаете значение от получателя, возможно, что другой поток вызовет метод установки и изменит значение. Поэтому, чтобы избежать нарушения данных, мы должны сделать так, чтобы сеттер и получатель синхронизировались, и они должны быть заблокированы одной блокировкой объекта.

0
Prashant Kumar 7 Мар 2015 в 15:01

Ответ зависит от того, является ли поле изменчивым.

Если поле не является изменчивым, тогда другие ответы верны. Вы можете прочитать значение, но поток, выполняющий чтение, не сможет «увидеть» значение, записанное другим потоком. Записанное значение может находиться в локальном кэше потока, поэтому второй поток всегда может видеть старое значение. Кроме того, JIT-компилятор может изменить порядок кода таким образом, чтобы он работал только в том случае, если никто не считывает значение одновременно.

Если поле непостоянно, вы получите желаемое поведение. JVM гарантирует, что каждый поток получит последнее значение.

Обратите внимание, что вы не должны выполнять операции чтения-изменения-записи (например, увеличение целочисленного поля) в изменчивом поле вне синхронизированного блока, потому что условия гонки могут привести к неожиданным результатам.

Дополнительные сведения см. В статье Параллелизм Java на практике.

2
NamshubWriter 7 Мар 2015 в 15:54

Вы можете прочитать свойство, т.е. поток будет видеть какое-то значение, но проблема в том, что оно непредсказуемо - оно может не отражать самое последнее значение, записанное другим потоком, или даже может быть случайным ценить. Следовательно, вам также следует синхронизировать геттер. Небезопасно синхронизировать только методы, которые пишут в переменную.

3
M Anouti 7 Мар 2015 в 14:12