Вопрос по java, multithreading – синхронизированный объект установлен в нуль

22

У меня есть две темыThread1 а такжеThread2

//Within Thread1     
synchronized(obj1)  
{  
    obj1 = null;  
}  

//Within Thread2  
synchronized(obj1)  
{  
    do something  
}   

Если jvm сначала выполняет thread1 и устанавливает для obj1 значение null, то thread2 сразу же увидит это изменение или потребуется время, и jvm все еще может запустить синхронизированный блок thread2, поскольку obj1 еще не имеет значение null?

@ Korhan & # xD6; zt & # xFC; rk Он не мог сам попробовать, любой тип проблем, связанных с параллелизмом, не является детерминированным. Эти типы комментариев чрезвычайно разочаровывают, когда контекст не известен. John Vint

Ваш Ответ

5   ответов
4

synchronized синхронизируется по объекту, а не по ссылке. Установивobj1 (ссылка) на null, thread2 не может синхронизироваться с объектом, на который ранее указывалobj1вы получитеNullPointerException вместо.

1

он может изменить значение obj1 по желанию. Поток 2 должен ждать, пока Поток 1 не снимет блокировку. Он обязательно увидит obj1 == ноль

33

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

1

чтобы сделать объект простым массивом из 1 элемента и обратиться к массиву для синхронизации, например,

Object [] obj1 = {null};

Элемент может быть нулевым, не влияя на существование массива. Разумеется, это все еще нарушает «правило» не использовать сам объект в синхронизации, но если ваш код не усложняет ситуацию в другом месте, это быстрое исправление должно работать как положено.

12

что изменение переменной, используемой для синхронизации, являетсяterribly bad thing& # X2122 ;.obj1 должно бытьfinal и никогда не трогать, если он используется в качестве монитора.

Как говорится, вернемся к вашему вопросу:

Если JVM сначала выполняет Thread1, он синхронизируется наobj1, устанавливает егоnull и нить выходит. Второй поток хочет синхронизировать наobj1, NullPointerException будет брошен. Потому что модификацияobj1 сделано в синхронизированном блоке, гарантированно, что Thread2 увидит обновленное значение (так:NullPointerException гарантировано).

Если Thread1 прерывается после получения блокировкиobj1 но перед очисткой ссылки Thread2 заблокируетсяobj1 и дождитесь окончания Thread1. Затем он успешно войдет в монитор, потому что объект, на который ранее ссылалисьobj1 все еще существует.

Error: User Rate Limit Exceeded vjk
Error: User Rate Limit ExceededIf Thread1 is interrupted after obtaining the lock on obj1 but before clearing the reference, Thread2 will lock on obj1 and wait until Thread1 finishedError: User Rate Limit Exceeded
Error: User Rate Limit ExceededNullPointerExceptionError: User Rate Limit ExceedednotError: User Rate Limit ExceededsynchronizedError: User Rate Limit ExceededsynchronizedError: User Rate Limit ExceededbeforeError: User Rate Limit ExceededsynchronizedError: User Rate Limit ExceededNullPointerExceptionError: User Rate Limit ExceededsynchronizedError: User Rate Limit ExceededNullPointerExceptionError: User Rate Limit Exceeded

Похожие вопросы