具有相同类的私有静态变量的公共类

时间:2016-08-02 22:05:34

标签: java static synchronization public

前几天查看了一些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())同步的目的是什么?

2 个答案:

答案 0 :(得分:1)

有一些类似设计模式的功能可以告诉您有效编写代码的方法。您提供的示例称为 Singleton 。此模式的目的是创建一个以及该类的唯一一个实例。它需要:

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

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

    以上示例称为延迟初始化,因为在您第一次调用getInstance()之前,不会创建该实例。

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

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

答案 1 :(得分:0)

您的问题中的代码是实现Java Singleton Pattern。

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

希望这有助于您更好地理解它。

干杯!