簡體   English   中英

當一個對象被鎖定,並且該對象被替換時,是否保持了鎖?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM