【问题标题】:Public Class with private static variable of same class具有同一类的私有静态变量的公共类
【发布时间】:2016-08-02 22:05:34
【问题描述】:

前几天浏览一些 Java 代码时,我看到了一些我以前从未见过的东西,对此有些困惑。部分代码如下:

public class PreferredAlternateProxy {
    ...
    private static PreferredAlternateProxy instance;
    ...

    public static PreferredAlternateProxy getInstance(){
        if(instance == null)
            createInstance();

        return instance;
    }

    private static synchronized void createInstance(){
        if(instance == null)
            instance = new PreferredAlternateProxy();
    }
}

声明与公共类同类的静态属性的目的是什么?这在什么情况下有用?

使第二个方法(createInstance())同步的目的是什么?

【问题讨论】:

  • "What is the purpose of making the second method (createInstance()) synchronized?" -- 所以可以懒惰地创建一个且只有一个实例。
  • 这段代码,是不是完全断章取义?或者它是否有文档、cmets 或其他解释?
  • 它是作为创建类似课程时的指南发送给我的,因此实际上没有上下文或 cmets
  • "使第二个方法 (createInstance()) 同步的目的是什么?它叫做double-checked locking
  • @Tony 您可能还想阅读what is so bad about singletons?

标签: java static synchronization public


【解决方案1】:

设计模式 之类的东西可以告诉您高效编写代码的方法。您提供的示例称为Singleton。此模式的目的是创建 一个 并且该类的唯一一个实例。它需要:

  1. 私有构造函数 - 任何人都无法创建该类的实例。
  2. 私有静态字段 - 将生成的实例保存在内存中。
  3. 公共静态方法 - 即“看门人”,其工作是返回实例。

例子:

public class Singleton() {
    private static Singleton instance;

    private Singleton() {

    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

上面的例子叫做Lazy Initialization,因为在你第一次调用getInstance()之前不会创建实例。

下面的示例显示了早期初始化,它在类加载到内存时立即创建实例。

public class Singleton() {
    private static Singleton instance = new Singleton();

    private Singleton() {

    }

    public static Singleton getInstance() {
        return instance;
    }
}

【讨论】:

    【解决方案2】:

    您的问题中的代码是实现 Java 单例模式。

    • 您的示例中的 PreferredAlternateProxy 是静态的以创建一个类 level 变量,因为您只需要一个实例。
    • 添加了第二个方法以使其线程安全并降低直接调用同步方法的成本。虽然我们只需要它用于可能创建单独实例的前几个线程。它被称为双重检查锁定原理。因此,如果创建了实例,那么您将不再调用同步方法。

    希望这可以帮助您更好地理解它。

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 2011-11-06
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多