Java 单例模式
饿汉式:
- 构造器私有化 => 防止直接new
- 类内部创建对象赋予static变量
- 向外暴露static公共方法,返回类实例变量
package com;
public class Singleton {
  private String name;
  public static int n = 22;
  private static Singleton singleton = new Singleton("singleton");
  private Singleton(String name) {
    System.out.println("constructor was called");
    this.name = name;
  }
  public static Singleton getInstance() {
    return singleton;
  }
  @Override
  public String toString() {
    return "Singleton{" +
        "name='" + name + '\'' +
        '}';
  }
}
package com;
import org.jetbrains.annotations.NotNull;
public class Test {
  public static void main(String @NotNull [] args) {
    Singleton s1 = Singleton.getInstance();
    Singleton s2 = Singleton.getInstance();
    System.out.println(s1==s2);
    System.out.println(s1);
    System.out.println(s2);
  }
}
懒汉式
- 构造器私有化
- 定义static类属性保存实例
- 提供public static方法返回static类属性保存的实例
- 只有当用户使用getInstance时,才返回构造实例,再次调用,返回之前创建的实例
package com;
public class Singleton {
  private String name;
  public static int n = 33;
  private static Singleton singleton;  // default null
  private Singleton(String name) {
    System.out.println("constructor was called");
    this.name = name;
  }
  @Override
  public String toString() {
    return "Singleton{" +
        "name='" + name + '\'' +
        '}';
  }
  public static Singleton getInstance(String name) {
    if (singleton == null) {
      singleton = new Singleton(name);
    }
    return singleton;
  }
}
package com;
import org.jetbrains.annotations.NotNull;
public class Test {
  public static void main(String @NotNull [] args) {
    System.out.println(Singleton.n);
//    Singleton s1 = Singleton.getInstance("s1");
//    Singleton s2 = Singleton.getInstance("s2");
//    System.out.println(s1==s2);
//    System.out.println(s1);
//    System.out.println(s2);
  }
}
二者区别:
1: 创建时机不同,饿汉式类加载时就创建了对象实例,懒汉式getInstance时才创建
2: 饿汉式不存在线程安全问题,懒汉式存在线程安全问题
3: 饿汉式存在浪费资源的可能,懒汉式使用时才创建
4: javaSE标准类中,java.lang.Runtime就是单例模式
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号