[英]When an object is locked, and this object is replaced, is the lock maintained?
假設我有這個java代碼:
synchronized(someObject)
{
someObject = new SomeObject();
someObject.doSomething();
}
在調用doSomething()時,SomeObject的實例是否仍然被鎖定?
在同步塊結束之前,線程仍然擁有someObject
原始值的監視器。 如果你想象有兩個方法, Monitor.enter(Object)
和Monitor.exit(Object)
那么synchronized塊的行為類似於:
SomeObject tmp = someObject;
Monitor.enter(tmp);
try
{
someObject = new SomeObject();
someObject.doSomething();
}
finally
{
Monitor.exit(tmp);
}
從JLS第14.19節 :
通過首先評估表達式來執行同步語句。
如果表達式的評估由於某種原因突然完成,則同步語句由於同樣的原因而突然完成。
否則,如果Expression的值為null,則拋出NullPointerException。
否則,讓表達式的非空值為V.執行線程鎖定與V關聯的鎖。然后執行塊。 如果塊的執行正常完成,則解鎖並且synchronized語句正常完成。 如果塊的執行因任何原因突然完成,則鎖定被解鎖,然后同步語句突然完成,原因相同。
請注意評估僅發生一次。
鎖定適用於對象,而不是變量。 在someObject = new SomeObject();
變量someObject
引用一個新對象,該鎖仍然在舊對象上。
再見和再見非常危險。
我相信someObject的前一個實例已被鎖定,並且您的新實例未被鎖定。
理解同步方法和同步語句之間的區別非常重要。
看一下這個解釋得很好的頁面: http : //download.oracle.com/javase/tutorial/essential/concurrency/locksync.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.