Синхронизированное чтение свойства как несинхронизированное свойство

1

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

  • 0
    Возможно, переименуйте сводку в «Несинхронизированное чтение поля, установленного в синхронизированном методе».
Теги:
multithreading
synchronized

4 ответа

2
Лучший ответ

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

3

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

2

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

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

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

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

Для получения дополнительной информации прочитайте Java Concurrency на практике.

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню