Измените конфигурацию для установки зависимостей в шаге {{x0}}:

synchronized(object)
{
    read object fields
}

Пока код поля считываемого объекта выполняется в потоке 1, если поток 2 хочет обновить поля объекта, ему придется ждать, пока поток 1 закончит чтение полей объекта перед обновлением (например, объект заблокирован от доступа других потоков, в то время как блок синхронизированного кода выполняется)?

1
G Vaid 2 Янв 2016 в 00:51

3 ответа

Лучший ответ

Нет, второй нить не будет ждать, если у него тоже не будет блока {{x0}} на одном объекте.

synchronized(object)
{
    // read object fields
}

... in other thread:

synchronized(object)
{
    // write object fields
}
0
Tamas Hegedus 1 Янв 2016 в 21:56

Синхронизированный блок защищает только код внутри него. Таким образом, если два или более потока попытаются запустить код внутри синхронизированного блока (защищенного одним и тем же монитором объектов), они будут выполняться исключительно. Это означает, что если один поток вошел в синхронизированный блок, другим придется ждать, пока он выйдет.

Синхронизированный блок не блокирует объект в любом случае, он просто использует монитор объекта для защиты кода внутри него. Если вы хотите сделать метод безопасности объекта потока, то вы должны объявить их синхронизированными.

synchronized getField()
synchronized setField()

Теперь getField () и setField () можно безопасно вызывать несколькими потоками.

Однако использование synchronized снижает производительность, вместо этого вы можете попробовать использовать Locks или Atomic классы в java.util.concurrent.atomic , например AtomicInteger, AtomicBoolean или AtomicReference.

0
11thdimension 1 Янв 2016 в 22:21

Синхронизация объекта никоим образом не «блокирует» его. Если обновление полей объекта не синхронизируется таким же образом, оно вполне может чередоваться с кодом чтения, который вы здесь представили.

1
Mureinik 1 Янв 2016 в 21:55