【问题标题】:Synchronizing multiple static variables of a singleton class同步单例类的多个静态变量
【发布时间】:2013-02-04 07:42:26
【问题描述】:

我只需要同步以下单例类的 obj1 和 obj2,以便多个线程可以获取该类的单个实例,但是一次只能有一个线程可以访问 obj1 或 obj2。

  public class Sample{

    private static LinkedHashMap<String, String> obj1;
    private static LinkedHashMap<String, String> obj2;

    public static Sample getInstance() {
        if (instance == null) {
            instance = new Sample();
        }
        return instance;
    }

    private Sample() {

    }

    public void add(LinkedHashMap lhm){
        //steps
        }

    public void remove(LinkedHashMap lhm){
        //steps
        }

}

我该怎么做呢?

【问题讨论】:

    标签: java variables synchronization singleton


    【解决方案1】:

    首先,将 2 个变量设为实例变量而不是静态变量。

    二、同步单例的方法:

    public synchronized void add(LinkedHashMap lhm){
        //steps
    }
    

    我会避免单例的惰性实例化。大多数时候,没有附加价值:

    private static final Sample INSTANCE = new Sample();
    
    public static Sample getInstance() {
        return INSTANCE;
    }
    

    如果你真的想保持延迟初始化,那么getInstance()方法也应该同步,另外两个线程可能会得到你的单例的两个不同实例。

    【讨论】:

    • 必须同步getInstance()(嗯,实际上一个instance字段),或者使instance静态并在那里初始化它,或者使用@987654327 @并完成整个事情:)
    • @BrianRoach:是的,我错过了。
    • @JBNizet 如果我在我的类中同步方法,那么不会同步类的整个实例吗?我希望多个线程能够修改这些linkedhashmap 对象,但每个变量一次只能修改一个。我需要一个变量特定的锁来精确
    • 这就是同步的全部意义所在。而且由于单例除了这些映射之外没有任何其他状态,这就是您想要的。
    猜你喜欢
    • 1970-01-01
    • 2014-02-03
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多