2012-04-11 2 views
3

Скажем, у вас есть этот код:Java Concurrency spec?: Является ли обновление для поля внутри синхронизированного блока видимым для всех потоков?

private Object lockObject = new Object(); 
private Integer myValue = new Integer(0); 

public void update(){ 
synchronized(lockObject){ 
    System.out.println(myValue); 
    myValue++; 
} 
} 

Теперь myValue не является ни synchronized на ни он ознаменовал volatile. Однако единственный способ его мутации - использовать метод update(). DZone's refcard на ядре Java-параллелизма говорит, что обновления для полей в синхронизированном блоке видны всеми потоками. Я был не уверен, что это означает только синхронизированный объект (lockObject) или любое поле (например myValue).

Может ли кто-нибудь уточнить это? Благодаря!

ответ

8

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

В качестве альтернативы, если вы действительно только есть счетчик, использовать AtomicInteger :)

+1

Итак, если у меня есть другой поток, читающий 'myValue', но он не синхронизируется с' lockObject', то это _possible_, он не увидит обновление? –

+1

@exabrial: Это мое понимание, да. –

+0

Удивительный, спасибо! I <3 AtomticInteger :) Я просто использовал «++» здесь как простой пример –

0

Рассмотрим:

  1. Резьба1 выполнения System.out.println(myValue); внутри синхронизированного блока выводит текущее значение myValue.

  2. Резьба2 выполнение System.out.println(myValue);перед тем шагом thread1 myValue получит то же значение myValue как в шаге 1. приращения

  3. Резьба1 myValue внутри синхронизированного блока.

  4. Резьба2 выполнения System.out.println(myValue);может получить новое значение myValue в установленный thread1.

Смежные вопросы