常用的设计模式---单例模式的六种实现方式

最近重新学习了一下单例模式,写博客总结一下,有错误或者另外的方法欢迎指出

单例模式的六种常见形式

一、饿汉式:直接创建对象,无线程安全问题

1.1直接实例化饿汉式(简洁直观)

package com.lp.singleton;

//1.1直接实例化饿汉式(简洁直观)
/*
直接创建实例对象
构造器私有化
自行创建,用静态变量保存
final用来强调单例,可以不加
 */

public class HungrySingleton1 {
    public static  final  HungrySingleton1  INSTANCE=new HungrySingleton1();
    private HungrySingleton1(){}
}

1.2枚举式(最简洁)

package com.lp.singleton;

/*
1.2枚举式(最简洁)
只声明一个,表示限定为单例
*/
    public enum HungrySingleton2{
        INSTANCE
    }



1.3静态代码块饿汉式(适合复杂饿汉式)

package com.lp.singleton;
/*
* 1.3静态代码块饿汉式(适合复杂饿汉式)
* 通过静态代码块创建实例
*/
public class HungrySingleton3 {
    public static  final HungrySingleton3   INSTANCE;
    static {
        INSTANCE=new HungrySingleton3();
    }
    private HungrySingleton3(){}
}

二、懒汉式:延迟创建对象

2.1线程不安全(适用于单线程)

package com.lp.singleton;

/*
 *2.1线程不安全(适用于单线程)
 * 构造器私有化
 * 用静态变量修饰
 * 提供静态变量方法获取对象
 */
public class lazySingleton1 {
    private static lazySingleton1 instance;

    private lazySingleton1() {
    }

    public static lazySingleton1 getInstance() {
        if (instance == null) {
            instance = new lazySingleton1();
        }
        return instance;
    }
}

2.2线程安全(适用于多线程)

package com.lp.singleton;

/*
 *2.2线程安全(适用于多线程)
 * 构造器私有化
 * 用静态变量修饰
 * 提供静态变量方法获取对象
 * 使用synchronized锁住对象
 */
public class lazySingleton2 {
//加volatile防止重排序,保证线程安全
    private volatile static lazySingleton2 instance;

    private lazySingleton2() {
    }

    public static lazySingleton2 getInstance() {
        if(instance == null) {
            synchronized (lazySingleton2.class) {
                if (instance == null) {
                    instance = new lazySingleton2();
                }
            }
        }
        return instance;
    }
}



2.3静态内部类(适用于多线程)

package com.lp.singleton;


/*
 *2.3静态内部类(适用于多线程)
 * 构造器私有化
 * 用静态变量修饰
 *在静态内部类被加载和初始化时,才创建INSTANCE实例对象
 * 静态内部类单独加载和初始化,不会随着外部类的加载和初始化而初始化
 */
public class lazySingleton3 {

    private lazySingleton3() {
    }

    private static class Inner {
        public static  final lazySingleton3   INSTANCE=new lazySingleton3();
    }
    public static lazySingleton3 getInstance(){
        return Inner.INSTANCE;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天一个秃顶小技巧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值