单例的四种实现方法

什么是单例设计模式

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例

饿汉单例设计模式

一上来我就把对象给你 new 好了,你来了直接就拿来使用了

/**
 * ClassName: Singleton
 * Description:
 * date: 2022/2/26 20:39
 *
 * @version JDK 1.8
 * @author: lisu
 */
public class Singleton {
    
    private final static Singleton single = new Singleton() ;
    
    // 把构造方法设计成私有  防止外部实例化
    private Singleton() {}  
    
    // 给外部返回实例用的
    public static Singleton getInstance() {
        return single ;
    }
}

优点:线程安全。
缺点:一开始就把实例load到内存。,当系统中这样的类较多时,会使得启动速度变慢 。

懒汉单例设计模式

你要使用我再来实例化,否则我就不实例化

/**
 * ClassName: Singleton
 * Description:
 * date: 2022/2/26 20:39
 *
 * @version JDK 1.8
 * @author: lisu
 */
public class Singleton {

    private static Singleton single  ;

    // 把构造方法设计成私有  防止外部实例化
    private Singleton() {}

    // 给外部返回实例用的
    public static Singleton getInstance() {    //对获取实例的方法进行同步
        if (single == null) {
            synchronized (Singleton.class) {
                if (single == null) {
                    single = new Singleton();
                }
            }

        }
        return single;
    }
    
}

静态内部类设计模式

这个实现方法保证了线程安全和性能。

/**
 * ClassName: Singleton
 * Description:
 * date: 2022/2/26 20:39
 *
 * @version JDK 1.8
 * @author: lisu
 */
public class Singleton {

    // 把构造方法设计成私有  防止外部实例化
    private Singleton() {}

    // 把实例放在内部类里面,这样JVM及帮我们实现线程安全,也防止了一开始就加载到内存
    private static class SingletonHolder {
        private static final Singleton Sington=new Singleton();
    }


    // 给外部返回实例用的
    public static Singleton getInstance() {    //对获取实例的方法进行同步
        return SingletonHolder.Sington;
    }

}

第一次加载Singleton类时不会去初始化Sington,只有第一次调用getInstance,虚拟机加载SingletonHolder并初始化Sington,这样不仅能确保线程安全,也能保证 Singleton 类的唯一性。所以,推荐使用静态内

枚举单例设计模式

在《effective java》中说道,最佳的单例实现模式就是枚举模式。利用枚举的特性,让JVM来帮我们保证线程安全和单一实例的问题。除此之外,写法还特别简单。

import org.omg.CORBA.PUBLIC_MEMBER;

/**
 * ClassName: SingletonEnum
 * Description:
 * date: 2022/2/26 20:56
 *
 * @version JDK 1.8
 * @author: lisu
 */
public enum SingletonEnum {

    INSTALL ;

    public void doThings() {
        System.out.println("do......");
    }
}

调用方法如下

/**
 * ClassName: SingletonEnumTest
 * Description:
 * date: 2022/2/26 20:57
 *
 * @version JDK 1.8
 * @author: lisu
 */
public class SingletonEnumTest {

    public static void main(String[] args) {

        SingletonEnum.INSTALL.doThings();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值