У меня есть неатомное свойство java, которое можно установить с помощью синхронизированного установщика. У меня вопрос: могу ли я прочитать это свойство несинхронизированным геттером? Благодарю.
4 ответа
Если свойство не является атомарным, вам, возможно, придется ввести ReadwriteLock. См. http://docs.oracle. com / javase / 7 / docs / api / java / util / concurrent / locks / ReadWriteLock.html
Вы можете прочитать значение с помощью метода получения, но вы можете получить непредсказуемое значение. Из-за того, что вы получаете значение от получателя, возможно, что другой поток вызовет метод установки и изменит значение. Поэтому, чтобы избежать нарушения данных, мы должны сделать так, чтобы сеттер и получатель синхронизировались, и они должны быть заблокированы одной блокировкой объекта.
Ответ зависит от того, является ли поле изменчивым.
Если поле не является изменчивым, тогда другие ответы верны. Вы можете прочитать значение, но поток, выполняющий чтение, не сможет «увидеть» значение, записанное другим потоком. Записанное значение может находиться в локальном кэше потока, поэтому второй поток всегда может видеть старое значение. Кроме того, JIT-компилятор может изменить порядок кода таким образом, чтобы он работал только в том случае, если никто не считывает значение одновременно.
Если поле непостоянно, вы получите желаемое поведение. JVM гарантирует, что каждый поток получит последнее значение.
Обратите внимание, что вы не должны выполнять операции чтения-изменения-записи (например, увеличение целочисленного поля) в изменчивом поле вне синхронизированного блока, потому что условия гонки могут привести к неожиданным результатам.
Дополнительные сведения см. В статье Параллелизм Java на практике.
Вы можете прочитать свойство, т.е. поток будет видеть какое-то значение, но проблема в том, что оно непредсказуемо - оно может не отражать самое последнее значение, записанное другим потоком, или даже может быть случайным ценить. Следовательно, вам также следует синхронизировать геттер. Небезопасно синхронизировать только методы, которые пишут в переменную.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.