代码之家  ›  专栏  ›  技术社区  ›  PEELY

Java同步轮询

  •  0
  • PEELY  · 技术社区  · 16 年前

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

    [更新]

    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;
        }
    }
    
    3 回复  |  直到 16 年前
        1
  •  12
  •   Jon Skeet    16 年前

    永远不要对字符串进行同步,特别是对被互连的字符串文字。你基本上只有一把锁。

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

        2
  •  1
  •   lemnisca    16 年前

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

        3
  •  0
  •   Marko    16 年前

    互斥体不是最终的,资源也不是私有的。

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