java中的单例模式

时间:2013-07-20 07:53:06

标签: java

我正在经历设计模式并遇到了Singleton Pattern

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

    private SingletonPattern() { }

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

现在我明白synchronized会帮助两个线程无法访问getInstance方法但是如果我错了就纠正我两个不同的对象将有两个锁,每个都有一个。另一个线程可以从anther对象启动然后获取然后访问getInstance因此我们可以有两个对象。??

4 个答案:

答案 0 :(得分:2)

没有。 synchronized方法将阻止2个线程同时调用该方法。您可以阅读已同步的here。在static方法的情况下,synchronized同步作用于类而不是对象。

然而,这种制作单身人士的方式效率低下。 Double Checked Locking被打破了。在java中做单例的最好方法是使用Enum

答案 1 :(得分:0)

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

single = new SingletonPattern();

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

然后函数getInstance()的所有连续调用都不会进入if子句,因此只返回相同的变量single,这是对SingletonPattern类的同一实例的引用。

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

答案 2 :(得分:0)

没有。由于getInstancesingle是静态的,因此两个线程将使用完全相同的方法和对象,因此不会有两个对象。 synchronized将确保他们不会同时访问getInstance

答案 3 :(得分:0)

synchronized static方法将获取Class锁,并且该类的所有对象都有一个类锁。因此,将阻止不同的对象同时获取此锁。

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

虽然在java中实现单例的最佳方法是使用枚举