单例模式

本文详细介绍了单例模式的五种实现方法:饿汉式、懒汉式、双重检测锁式、静态内部类式及枚举单例。每种实现方式的特点、优缺点以及适用场景都做了详细的解释。
  • 单例模式     保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。

    很多时候我们都需要使用单例模式,因为它只生成一个实例,减少了系统性能开销。

    那么单例模式有哪些实现方法呢?

  • 主要分为
  1. 饿汉式(线程安全,调用效率高,但是不能延时加载)
  2. 懒汉式(线程安全,调用效率不高,可以延时加载)
  • 其它方式
  1. 双重检测锁式(由于JVM底层模型原因,偶尔会出现问题,不建议使用)
  2. 静态内部类式(线程安全,调用效率高,可以延时加载)
  3. 枚举单例(线程安全,调用效率高,不能延时加载)

  • 饿汉式
public class SingletonDemo {

    private static SingletonDemo instance = new SingletonDemo(); //类初始化时立即加载这个对象

    //私有构造器
    private SingletonDemo(){

    }

    //方法没有同步,调用效率高
    public static SingletonDemo getInstance(){
        return instance;
    }
}

  • 懒汉式(资源利用率高,并发效率低)
public class SingletonDemo {

    private static SingletonDemo instance; //类初始化时不加载这个对象

    //私有构造器
    private SingletonDemo(){ }

    //方法必须同步,防止高并发时多线程同时使用生成多个实例
    public static synchronized SingletonDemo getInstance(){
        if (instance==null){
            instance = new SingletonDemo();
        }
        return instance;
    }
}

  • 双重检测锁式(不建议使用)
public class SingletonDemo {

    private static SingletonDemo instance = null;

    //私有构造器
    private SingletonDemo(){}
    public static SingletonDemo getInstance(){
        if (instance==null){
            SingletonDemo demo;
            synchronized (SingletonDemo.class){
                demo = instance;
                if (demo == null){
                    synchronized (SingletonDemo.class){
                        if (demo == null){
                            demo = new SingletonDemo();
                        }
                    }
                    instance = demo;
                }
            }
        }
        return instance;
    }
}

  • 静态内部类式(线程安全,调用效率高,实现延时加载)
public class SingletonDemo {
    private static class SingletonClassInstance{
        private static final SingletonDemo instance = new SingletonDemo();
    }

    private SingletonDemo(){}
    
    public static SingletonDemo getInstance(){
        return SingletonClassInstance.instance;
    }

}

  • 枚举单例
public enum SingletonDemo {
   //枚举元素本身就是单例
    INSTANCE;

    //添加自己的操作
    public void singletonOperation(){

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值