将同步对象设置为空

2022-09-01 13:53:17

我有两个线程和Thread1Thread2

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

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

如果 jvm 首先执行 thread1 并将 obj1 设置为 null,那么 thread2 会立即看到该更改,还是需要时间,并且由于 obj1 尚未为 null,jvm 仍然可以运行 thread2 同步块?


答案 1

这几乎肯定会破坏同步抽象 - 我不相信会立即看到变化。切勿更改要同步的对象的引用,更不应将其设置为 ,这将导致 任何进一步尝试对其进行同步。thread2nullNullPointerException


答案 2

首先让我强调一下,修改用于同步的变量是一件非常糟糕的事情。 应该并且如果它被用作监视器,则永远不要触摸。obj1final

话虽如此,回到你的问题:

如果 JVM 首先执行 Thread1,它将同步 on ,将其设置为 和线程退出。第二个线程想要同步 于 将被抛出。由于 在同步块中进行了 修改,因此可以保证 Thread2 将看到更新的值(因此:是有保证的)。obj1nullobj1NullPointerExceptionobj1NullPointerException

如果 Thread1 在获得锁定后但在清除引用之前被中断,则 Thread2 将锁定并等待 Thread1 完成。然后,它将成功进入监视器,因为先前引用的对象仍然存在。obj1obj1obj1