【问题标题】:Java synchronisation pollJava 同步轮询
【发布时间】:2008-12-05 10:58:11
【问题描述】:

这是我曾经看过的一些代码。你能看出它有什么问题吗?

[更新]

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;
    }
}

【问题讨论】:

  • 哦,天哪,在不评论的情况下进行更多的降级。是不是我用的是 Java 而不是 C#?
  • 可能这不是一个真正需要讨论或帮助的问题.. 它基本上是一个琐事测验。有些人可能不会在一个问题中这样做......
  • 只是为了记录(只是注意到这一点),在标题中使用英国/澳大利亚的“-isation”可能有点奇怪——即使我更喜欢它,java 关键字是 -ize 所以这可能会使它更易于搜索。 :)

标签: java synchronization


【解决方案1】:

永远不要在字符串上同步,尤其是被实习的字符串文字。你基本上只有一把锁。

一般来说,永远不要同步任何可能在您的类之外可见的引用(包括“this”)除非外部可见性的目的正是为了锁定目的。我通常使用专门为锁定目的创建的private final 变量。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这里的问题不是字符串的不变性 - 它是字符串文字的实习。 Java可以保留不可变字符串但没有完成实习,在这种情况下,这段代码可以工作。
    • 啊,真的...我知道我的意思,但说得很糟糕。众所周知,这对程序员来说不是一件好事,感谢您的指正。 :)
    • 是的,可以使用 mutex = new String(""); :)
    【解决方案3】:

    mutex 不是最终的,资源不是私有的。

    此外,您需要一个返回资源的 getResource 方法,但我想这只是一个错字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      相关资源
      最近更新 更多