单例设计模式---懒汉式--线程安全和不安全、枚举类
单例设计模式—懒汉式–线程安全和不安全
优点
资源利用率高:只有在真正需要使用单例实例时才进行创建,避免了在应用启动时就占用不必要的资源。
缺点
线程安全问题:在多线程环境下,如果多个线程同时调用获取实例的方法,可能会导致创建多个实例,破坏单例模式的规则。需要额外的同步机制来保证线程安全,但这可能会带来一定的性能开销。
线程不安全
//懒汉式 线程不安全
public class Singleton {
//私有构造方法
private Singleton(){}
//声明Singleton类型的变量instance
private static Singleton instance;//只是声明了该类型的变量,并没有创建
//对外提供访问方式
public static Singleton getInstance(){
//判断instance是否为null,如果为null,说明还没有创建Singleton类的对象
//如果没有创建一个并返回。如果有,直接返回
if(instance == null){
//线程1等待,线程2获取到cpu的执行权,也会进入到该判断里面
//多线程执行时,只要线程停留在这里,其他线程就可以进入,那么就不是单实例模式
instance = new Singleton();
}
instance=new Singleton();
return instance;
}
}
public class Client {
public static void main(String[] args) {
Singleton instance =Singleton.getInstance();
Singleton instance1 =Singleton.getInstance();
//判断两次获取到的Singleton对象是否是同一个对象
System.out.println(instance==instance1);
}
}
线程安全
//线程安全,依据以上线程不安全做修改
public class Singleton {
//私有构造方法
private Singleton(){}
//声明Singleton类型的变量instance
private static Singleton instance;//只是声明了该类型的变量,并没有创建
//对外提供访问方式
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
instance=new Singleton();
return instance;
}
}
枚举类
饿汉式枚举类是实现单例模式的一种高效且安全的方式。
枚举类型在 Java 中是一种特殊的类,它的实例是有限且固定的。当使用枚举类实现单例模式时,枚举类的实例在类加载时就会被创建,并且是唯一的,这符合饿汉式单例的特点,即在类加载时就初始化单例实例。同时,Java 语言规范保证了枚举类型的实例是线程安全的,并且可以防止反射攻击和反序列化时创建新的实例。
package patten.demo6;
//饿汉式 枚举类
public enum Singleton {
INSTANCE;
}
枚举类测试
public class Client {
public static void main(String[] args) {
Singleton instance = Singleton.INSTANCE;
Singleton instance1 = Singleton.INSTANCE;
//判断两次获取到的Singleton对象是否是同一个对象
System.out.println(instance==instance1);
}
}