0

我正在经历设计模式并遇到了单例模式

class SingletonPattern implements Runnable {
    private static SingletonPattern single=null;

    private SingletonPattern() { }

    public synchronized static SingletonPattern getInstance() {
        if(null==single) {
            single=new SingletonPattern();
        }
        return single;
    }
}

现在我明白同步将有助于两个线程无法访问 getInstance 方法,但如果我错了,请纠正我两个不同的对象将有两个锁,每个锁都有一个。另一个线程可以从另一个对象启动,然后访问 getInstance() 方法因此我们可以有两个对象。??

4

4 回答 4

2

不会。同步方法会阻止 2 个线程同时调用该方法。你可以在这里阅读同步。在static方法的情况下,同步作用于类而不是对象。

然而,这种制作单例的方式效率低下。并且双重检查锁定已损坏。在 java 中做单例的最好方法是使用枚举

于 2013-07-20T07:57:34.490 回答
0

变量 single 是静态的。也就是说,类 SingletonPattern 的所有实例共享同一个变量 single。函数getInstance()第一次执行时,变量single为null,所以

single = new SingletonPattern();

执行,这使得变量 single 不再为空。

那么所有后续的getInstance()函数调用都不会进入if子句,只返回同一个变量single,它是对同一个类SingletonPattern实例的引用。

synchronized 关键字还确保不会在两个线程中同时调用函数 getINstance()。

于 2013-07-20T08:01:21.320 回答
0

不,因为getInstancesingle都是静态的,所以两个线程都将使用相同的方法和对象,因此不会有两个对象。synchronized将确保他们不会同时访问内部getInstance

于 2013-07-20T08:03:24.843 回答
0

同步静态方法将获取类锁,并且该类的所有对象都有一个类锁可用。因此,将阻止不同的对象同时获取此锁。

但是只要不涉及不同的类加载器,这种机制就可以工作。

尽管在 Java 中实现单例的最佳方法是使用枚举

于 2013-07-20T08:04:03.720 回答