专栏首页RelaxHeart网聊聊Java源码 : 设计模式之单例模式的5种实现
原创

源码 : 设计模式之单例模式的5种实现

方式一:饿汉式


package cn.relaxheart.designModel.singleton;

/**
 *
 * @Date: 2019-6-1 0001 15:49
 * @Description: 单例实现方式一:饿汉式单例
 *
 * 1. 饿汉式单例在类加载初始化时就创建了一个静态的对象供外部使用,除非系统重启,否则这个对象不会改变。【线程安全】
 *
 * 2. 私有构造,限制外部类实例化该对象 (事实上通过反射是可以实例化构造方法为私有的类的,那基本上会使所有的Java单例实例失效.)
 * 3. 唯一实例只能通过getInstance()方法获取
 *
 */
public class SingletonModel1 {

    // 1. 私有构造
    private SingletonModel1(){}

    // 2. 私有静态全局变量
    private static SingletonModel1 singletonModel1 = new SingletonModel1();

    // 3. 公有静态工厂方法
    public static SingletonModel1 getInstance(){
        return singletonModel1;
    }
}

方式二:懒汉式


package cn.relaxheart.designModel.singleton;

/**
 *
 * @Date: 2019-6-1 0001 15:55
 * @Description: 单例模式实现方式二:懒汉式(延迟加载)
 *
 * 1. 该方式虽然通过延迟加载实现了单例,但是在多线程环境在会产生多个SingletonModel2实例【非线程安全】
 */

public class SingletonModel2 {

    // 1. 私有构造
    private SingletonModel2(){}

    // 2. 私有静态全局为初始化实例变量
    private static SingletonModel2 singletonModel2 = null;

    public static SingletonModel2 getInstance(){
        if (singletonModel2 == null){
            singletonModel2 = new SingletonModel2();
        }
        return singletonModel2;
    }
}

线程安全问题优化:

package cn.relaxheart.designModel.singleton;

/**
 *
 * @Date: 2019-6-1 0001 15:58
 * @Description: 使用synchronized同步锁 对懒汉式单例优化
 *
 * 1. 方法上加synchroinzed,或者使用同步代码块加同步锁,此方法虽然解决了线程安全问题,但是效率低下。当一个线程想要获取实例,
 * 还需要等待上一个线程释放锁。
 */

public class SingletonModel21 {

    // 1. 私有构造
    private SingletonModel21(){}

    // 2. 私有静态未初始化实例
    private static SingletonModel21 singletonModel21 = null;

    public static SingletonModel21 getInstance(){

        // 等同于 synchronized public static SingletonModel21 getInstance()
        synchronized (SingletonModel21.class){
            if (singletonModel21 == null){
                singletonModel21 = new SingletonModel21();
            }
        }

        return singletonModel21;
    }
}

优化方法前加同步锁影响效率的实现

package cn.relaxheart.designModel.singleton;

/**
 * 
 * @Date: 2019-6-1 0001 16:03
 * @Description: 延迟加载同步锁优化
 *
 * 1. 使用双重检查锁,可以避免整个方法加锁,只对需要加锁的代码块加锁,可提高效率。
 */

public class SingletonModel22 {

    // 1. 私有构造
    private SingletonModel22(){}

    private static SingletonModel22 singletonModel22 = null;

    public static SingletonModel22 getInstance(){
        if (singletonModel22 == null){
            synchronized (SingletonModel22.class){
                if (singletonModel22 == null){
                    singletonModel22 = new SingletonModel22();
                }
            }
        }

        return singletonModel22;
    }
}

方式三:静态内部类


package cn.relaxheart.designModel.singleton;

/**
 * @Author: 王琦 <QQ.Eamil>1124602935@qq.com</QQ.Eamil>
 * @Date: 2019-6-1 0001 16:06
 * @Description: 单例模式实现方式三:静态内部类
 *
 * 1. 静态内部类虽然保证了多线程环境下的线程安全性,但是在遇到序列化对象时,默认方式运行结果实际上是多例的。
 */

public class Singleton3 {

    private static class Singleton3Clss{
        private static Singleton3 singleton3 = new Singleton3();
    }

    public static Singleton3 getInstance(){
        return Singleton3Clss.singleton3;
    }
}

方式四:静态代码块


package cn.relaxheart.designModel.singleton;

/**
 * 
 * @Date: 2019-6-1 0001 16:19
 * @Description: 单例实现方式:静态代码块
 */

public class Singleton4 {

    // 1. 私有构造
    private Singleton4(){}

    private static Singleton4 singleton4 = null;

    static {
        singleton4  = new Singleton4();
    }

    public static Singleton4 getInstance(){
        return singleton4;
    }
}

方式五:内部枚举类


public class SingletonFactory {
    // 内部枚举类
    private enum EnmuSingleton{
        Singleton;
        private Singleton5 singleton;
        //枚举类的构造方法在类加载是被实例化 
        private EnmuSingleton(){
            singleton = new Singleton5();
        }
        public Singleton5 getInstance(){
            return singleton;
        }
    }
    public static Singleton5 getInstance() {
        return EnmuSingleton.Singleton.getInstance();
    }
}
class Singleton5{
    public Singleton5(){}
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 倒计时器:CountDownLatch

    原文:https://www.relaxheart.cn/to/master/blog?uuid=83

    七七分享
  • grafana + influxdb + telegraf 构建性能监控平台

    原文链接:https://www.relaxheart.cn/to/master/blog?uuid=79

    七七分享
  • Java并发数据结构 — 并发List

    原文:https://www.relaxheart.cn/to/master/blog?uuid=74

    七七分享
  • lombok插件

    IDE: IntelliJ IDEA  首先在设置的插件栏中安装lombok,然后使用如下的pom依赖: <dependency>    <groupId>or...

    用户1134788
  • LeetCode7 整数翻转,做道简单题放松一下

    https://leetcode.com/problems/reverse-integer/

    TechFlow-承志
  • Java内部类的继承

    Java内部类的构造器必须连接到指向其外围类对象的引用(构造内部类必须给它一个外部类对象的引用,内部类依赖于外部类对象),所以在继承内部类的时候,需要在导出类的...

    老白
  • CTF实战24 二进制软件逆向分析基础

    该培训中提及的技术只适用于合法CTF比赛和有合法授权的渗透测试,请勿用于其他非法用途,如用作其他非法用途与本文作者无关

    用户1631416
  • 一个开源的五子棋大战送给各位小伙伴!

    有暇,做了个五子棋大战的小游戏送给各位小伙伴! 用到的知识点有: 1.JavaWeb基础知识(懂jsp,servlet足够) 2.JavaScript和jQue...

    江南一点雨
  • 从 10 Gb 到 40 Gb,从百万级到千万级转发,打造高性能 TGW

    TGW 是一套实现多网接入的负载均衡系统,为腾讯业务提供着外网接入服务。随着 TGW 影响力的提升,越来越多的业务接入 TGW,对于 TGW 的整体负载能力要求...

    腾讯架构师
  • 函数响应式编程及ReactiveObjC学习笔记 (三)

    今天先不去分析它的核心代码, 我们先看看ReactiveObjC库里面一些特别的东西, 如果大家点开ReactiveObjC目录应该会看到很多category...

    周希

扫码关注云+社区

领取腾讯云代金券