2008-12-05 178 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

您正在使用相同的字符串作为两个类的互斥体,因此一次只能使用一个同步块,这似乎不是代码的意图。