我正在经历设计模式并遇到了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因此我们可以有两个对象。??
答案 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)
没有。由于getInstance
和single
是静态的,因此两个线程将使用完全相同的方法和对象,因此不会有两个对象。 synchronized
将确保他们不会同时访问getInstance
答案 3 :(得分:0)
synchronized static方法将获取Class锁,并且该类的所有对象都有一个类锁。因此,将阻止不同的对象同时获取此锁。
但只要不涉及不同的类加载器,这种机制就可以工作。
虽然在java中实现单例的最佳方法是使用枚举