2008-12-05 37 views
0

下面是我看到過的一些代碼。你能看到它有什麼問題嗎?Java同步輪詢

[更新]

public class ResourceManager1 
{ 
    private final String mutex = ""; 
    Object resource = null; 

    public Object getResource() 
    { 
     synchronized (mutex) 
     { 
      if (resource == null) 
      { 
       resource = new Object(); 
      } 
     } 

     return resource; 
    } 
} 

public class ResourceManager2 
{ 
    private final String mutex = ""; 
    Object resource = null; 

    public Object getResource() 
    { 
     synchronized (mutex) 
     { 
      if (resource == null) 
      { 
       resource = new Object(); 
      } 
     } 

     return resource; 
    } 
} 
+0

哦好吃,沒有評論更多的標號。難道我用Java而不是C#? – fiddlesticks 2008-12-05 11:20:46

+0

也許這不是真正的討論或幫助問題..它基本上是一個瑣事問答。有些人可能不會爲了這個問題而去...... – Cowan 2009-01-11 09:25:46

+0

只是爲了記錄(剛注意到這個),在標題中使用英國/澳大利亞的「 - 化」可能有點奇怪 - 儘管我更喜歡它,java關鍵字是-ize,這樣可以使其更加可搜索。 :) – Cowan 2009-01-11 09:27:34

回答

12

從不同步字符串,尤其是字符串文字。你基本上只有一個鎖。

一般來說,絕對不要同步任何可能在您的課堂外可見的參考(包括「this」)除非外部可見性的目的正是爲了鎖定目的。我通常使用專爲鎖定而創建的private final變量。

0

互斥不是最終版本,資源是不是私人的。

此外,你需要一個返回資源的getResource方法,但我想這只是一個錯字。

1

您正在使用相同的字符串作爲兩個類的互斥體,因此一次只能使用一個同步塊,這似乎不是代碼的意圖。