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号