设计模式(饿汉式、懒汉、枚举)

文章详细介绍了Java中实现单例模式的三种常见方式:饿汉式、懒汉式和枚举方式,并分析了各自的优缺点。饿汉式在类加载时即创建实例,保证线程安全但可能导致内存浪费;懒汉式在首次调用时创建实例,存在线程安全问题;而枚举方式则既保证了线程安全,又避免了额外的同步开销。
摘要由CSDN通过智能技术生成

单例模式

一、饿汉式

1、构造器私有化
2、类的内部创建静态对象
3、向外暴漏一个静态的公共方法
public class Singleton {

    private Singleton() {
    }

   private final static Singleton singleton = new Singleton();

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

测试

public class client {
    public static void main(String[] args) {
        Singleton instance1 = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        System.out.println(instance1==instance2);

        System.out.println("instance1:"+instance1.hashCode());
        System.out.println("instance2:"+instance1.hashCode());
        
		/**
         * 问题  在类装载的时候就完成实例化,如果没有用过这个实例,就会造成内存浪费
         */
    }
}

结果:

true
instance1:460141958
instance2:460141958

还有一种饿汉式采用的是静态代码块初始化类的实例

static{
	instance = new instance();
}

二、懒汉式

1、在类的内部声明一个类的实例。
2、在类中搞个私有的无参构造器
3、提供一个静态的公有方法,创建这个实例
public class Singleton02 {
    private static Singleton02 singleton02;

    private Singleton02() {

    }

    public static Singleton02 getSingleton02(){
        if(singleton02 == null){
            singleton02 = new Singleton02();
        }
        return singleton02;
    }
}

测试

public class client02 {
    public static void main(String[] args) {
        Singleton02 instance01 = Singleton02.getSingleton02();
        Singleton02 instance02 = Singleton02.getSingleton02();
        System.out.println(instance01==instance02);
        System.out.println("instance01="+instance01.hashCode());
        System.out.println("instance02="+instance02.hashCode());
        
		/**
         * 问题 ,采用反射的爆破处理,使得单例模式中的懒汉式不安全
         */
        Constructor<Singleton02> declaredConstructor = Singleton02.class.getDeclaredConstructor(null);
        declaredConstructor.setAccessible(true);
        Singleton02 instance3 = declaredConstructor.newInstance();
        Singleton02 instance4 = declaredConstructor.newInstance();
        System.out.println(instance3==instance4);
        System.out.println("instance3:="+instance3);
        System.out.println("instance4:="+instance4);
    }
}

结果:

true
instance01=460141958
instance02=460141958

三、采用枚举解决单例模式安全性问题

1、枚举类
2、返回枚举
public enum EnumSingle {
    INSTANCE;

    public EnumSingle getInstance() {
        return INSTANCE;
    }

}

测试:

public class Test {
    public static void main(String[] args) {
        EnumSingle instance1 = EnumSingle.INSTANCE;
        EnumSingle instance2 = EnumSingle.INSTANCE;
        System.out.println(instance1==instance2);
        System.out.println("instance1:="+instance1.hashCode());
        System.out.println("instance2:="+instance2.hashCode());

    }
}

结果:

true
instance1:=460141958
instance2:=460141958
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值