2016-04-14 104 views
1

是否有效更新該引用的同步塊中的引用? 例如:Java同步塊

Synchronized(list) 
{ 
    list = new ArrayList(); 
} 

回答

1

是的,這是完全有效的,但通過這樣做你會得到什麼?此外,線程鎖定對象實例而不是保存對象引用的變量,因此即使您將某個其他實例重新賦值list,當前線程也已鎖定上一個對象。

爲了說明更多,假設list被分配了值val1。然後,thread1呈現val1鎖(這是由可變list指出),現在其他線程不能採取鎖val1(因爲它們是在參考list等待鎖在實例val1沒有),即使thread1已重新實例化list

更好的辦法是清除​​塊內的list而不是重新初始化它。

+0

我想通過另一個列表更新此列表。最好清除這個列表並添加全部內容?還有其他線程在這個列表上迭代。 –

+0

@AkashMahajan是的,理想情況下這應該是方法。 –

5

當編寫

synchronized (list) 

鎖是對象,不是變量/場list

如果你

synchronized (list) { 
    list = new ArrayList<>(); 
} 

要創建一個新的對象,並重新分配一個變量/場 - 但你並沒有改變鎖 - 鎖仍是同一個對象以前。