簡體   English   中英

這個可以嗎? 在同步塊中同步(線程),然后執行thread = null

[英]Is this ok? Synchronized( thread ), then thread=null in the synch block

我看到了這個:

// thread is a member of this class

synchronized( this.thread )
{
  this.thread.running = false;
  this.thread.notifyAll(); // Wake up anything that was .waiting() on
  // the thread
  this.thread = null;  // kill this thread reference.
  // can you do that in a synchronized block?
}

是否可以設置thread=null同時仍保持鎖定?

我在一些BB代碼中找到了這個金塊。

是的,沒關系。 synchronized語句將獲取其鎖定的引用的副本,並使用該副本計算出最后解鎖的內容。

Java語言規范的第14.19節實際上並不清楚這一點,但它確實聲明表達式在開始時進行了評估 - 並且未提及稍后再次對其進行評估。

有區別:

synchronized( this.thread )

您正在對象上同步this.thread指向的字段

this.thread = null;

你正在重新分配這個領域。 您沒有對上面引用的對象執行任何操作,因此鎖定仍然有效。

同步表達式在輸入時被解除引用,因此此鎖的任何后續用戶都將獲得NullPointerException。 您可以通過在同步塊之前放置一個空檢查來解決這個問題,但之后您已經引入了競爭條件。

你可以做到這一點,但幾乎可以肯定,代碼對於它想要實現的任何東西都是錯誤的。 發布整個代碼,我保證顯然程序員不懂並發。

不要重新分配用於同步的變量。

如果您還有一個為線程分配新值的塊,則只會出現問題。 在這種情況下,您有一個競爭條件,因為兩個塊不會鎖定同一個對象,但會更新相同的字段,並且它將隨機分配最后一個值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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