【问题标题】:Singleton Pattern in java [duplicate]java中的单例模式[重复]
【发布时间】:2013-07-20 16:10:20
【问题描述】:

我正在研究设计模式并遇到了单例模式

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 () 方法,因此我们可以有两个对象。??

【问题讨论】:

  • 锁定是在此处获取的类型不是对象。
  • 它的static synchronized 方法,因此将在SingletonPattern 类的class 对象上获取锁。检查此线程stackoverflow.com/questions/437620/…

标签: java


【解决方案1】:

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

但是,这种制作单例的方式效率低下。 Double Checked Locking 坏了。在java中做单例的最好方法是使用Enum

【讨论】:

  • Ok 那么单例模式是否说在特定时期内只能有一个类的实例
  • @Deepak_Sharma - 你的构造函数是私有的 - 所以除了 getInstance 方法没有人可以实例化你的类。
  • 双重检查成语坏了,但是为什么要同步绕法不能正常工作呢?所有线程缓存在进入之前都会正确更新,并在离开后刷新。 ???
  • @morpheus05 - 已更新。
  • @Deepak_Sharma - 如果 ctor 不是私有的,那么人们根本不需要调用 getInstance - 他们将正常实例化对象 - Singleton single = new Singleton(); Singleton anothersingle = new Singleton(); Singleton yetanothersingle = new Singleton();。将ctor 设为私有会迫使人们调用getInstance 来获取对象,这就是您获取单例模式的地方。
【解决方案2】:

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

single = new SingletonPattern();

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

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

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

【讨论】:

  • 解释得很好......非常感谢大家
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-19
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多