Java 单例模式

饿汉式

/**
 * 单例模式(饿汉式 - 类加载时主动创建实例)
 * Created by Sheldon on 2019/10/26.
 * Project Name: alstudy.
 * Package Name: test2.
 */
public class Singleton {

    // 静态初始化中创建单例实例,保证线程安全
    private static Singleton uniqueInstance = new Singleton();
    // 限制用户,使用户无法通过new方法创建对象
    private Singleton(){}
    public static Singleton getInstance(){
        return uniqueInstance;
    }
}

懒汉式

  1. 线程不安全
/**
 * 单例模式(懒汉式 - 检测到没实例时才创建实例)
 * Created by Sheldon on 2019/10/26.
 * Project Name: alstudy.
 * Package Name: test2.
 */
public class Singleton {
    
    private static Singleton uniqueInstance;
    // 限制用户,使用户无法通过new方法创建对象
    private Singleton(){}
    public static Singleton getInstance(){
        // 判断当前单例是否已创建,存在就返回,否则就创建后返回
        if (uniqueInstance == null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}
  1. 线程安全
    (在对应方法内使用synchronized关键字即可)
synchronized public static Singleton getInstance(){
        // 判断当前单例是否已创建,存在就返回,否则就创建后返回
        if (uniqueInstance == null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
  1. 双重检查加锁版
    (首先检查是否实例已经创建,如果尚未创建,“才”进行同步。这样以来,只有一次同步,这正是我们想要的效果。)
/**
 * 单例模式(懒汉式)
 * Created by Sheldon on 2019/10/26.
 * Project Name: alstudy.
 * Package Name: test2.
 */
public class Singleton {

    volatile private static Singleton uniqueInstance;
    // 限制用户,使用户无法通过new方法创建对象
    private Singleton(){}
    public static Singleton getInstance(){
        // 判断当前单例是否已创建,存在就返回,否则就创建后返回
        if (uniqueInstance == null){
            synchronized (Singleton.class){
                if (uniqueInstance == null){
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}
  1. 登记式/内部静态类方式
    (静态内部实现的单例是懒加载的且线程安全。)
    通过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,从而实例化 instance,意味着只有第一次使用这个单例的实例的时候才加载,同时不会有线程安全问题。
/**
 * 单例模式(懒汉式 - 登记式/静态内部类方式)
 * Created by Sheldon on 2019/10/26.
 * Project Name: alstudy.
 * Package Name: test2.
 */
public class Singleton {

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    private Singleton (){}
    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. 懒汉式 分析:  懒汉式给getInstance方法加上了同步锁,解决了多线程的情况下可能创建多个实例的问题...
    qiuxintai阅读 3,188评论 0 1
  • 首先什么是单例?就一条基本原则,单例对象的类只会被初始化一次。在 Java 中,我们可以说在 JVM 中只存在该类...
    woshishui1243阅读 1,490评论 0 0
  • 目录一.什么是单例?二.有几种?三.应用场景四.注意的地方 一.什么是单例? 单例模式 保证一个类在内存中只有一个...
    在挖坑的猿阅读 4,330评论 0 0
  • 定义 一个类只有一个实例,自行实例化并提供给整个系统。 基本思路 将该类构造函数私有化,并通过静态方法获取一个唯一...
    剧透下阅读 1,792评论 0 0
  • 参考文档 单例模式的几种实现方式: 1、懒汉式,线程不安全 描述:这种方式是最基本的实现方式,这种实现最大的问题就...
    John13阅读 1,396评论 0 0

友情链接更多精彩内容