java中的单例模式

java中的单例模式,java,Java,我在浏览设计模式时遇到了Singleton模式 class SingletonPattern implements Runnable { private static SingletonPattern single=null; private SingletonPattern() { } public synchronized static SingletonPattern getInstance() { if(null==single) {

我在浏览设计模式时遇到了Singleton模式

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方法,但请纠正我的错误,如果我错了,两个不同的对象将有两个锁,每个锁都有一个。另一个线程可以从另一个对象启动,然后访问getInstance()方法,因此我们可以有两个对象。否。同步方法将阻止两个线程同时调用该方法。你可以读同步的。对于
静态
方法,synchronized作用于类而不是对象


然而,这种制造单身汉的方法效率很低。而且是坏的。在java中执行Singleton的最佳方法是使用一个

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

single = new SingletonPattern();
执行,这使得变量single不再为null

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


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

否。由于
getINstance
single
是静态的,因此两个线程将使用非常相同的方法和对象,因此不会有两个对象
synchronized
将确保它们不会在
getInstance

内同时访问。synchronized静态方法将获取类锁,并且该类的所有对象都有一个可用的类锁。因此,不同的对象将无法同时获取此锁

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


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

Lock是在这里的type not对象上获得的。它的
静态同步
方法,所以锁将在SingletonPattern类的
对象上获得。检查这个线程Ok然后Singleton模式是否说在一个特定的时间段内只能有一个class@Deepak_Sharma-您的构造函数是私有的-因此除了getInstance方法外,没有人可以实例化您的类。双重检查习惯用法已被打破,但为什么围绕该方法进行的同步不能正常工作?所有线程缓存在进入前都已正确更新,并在离开后刷新@morpheus05-更新。@Deepak_Sharma-如果ctor不是私有的,那么人们根本不需要调用
getInstance
-他们将正常实例化对象-
Singleton single=new Singleton();Singleton anothersingle=新的Singleton();Singleton yetanothersingle=新Singleton()。制作
ctor
privates迫使人们调用
getInstance
来获取对象&这就是获得单例模式的地方。解释得很好…非常感谢大家