Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >源码 : 设计模式之单例模式的5种实现

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

原创
作者头像
七七分享
修改于 2020-07-13 02:25:24
修改于 2020-07-13 02:25:24
5030
举报
方式一:饿汉式

代码语言:txt
AI代码解释
复制
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;
    }
}
方式二:懒汉式

代码语言:txt
AI代码解释
复制
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;
    }
}

线程安全问题优化:

代码语言:txt
AI代码解释
复制
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;
    }
}

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

代码语言:txt
AI代码解释
复制
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;
    }
}
方式三:静态内部类

代码语言:txt
AI代码解释
复制
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;
    }
}
方式四:静态代码块

代码语言:txt
AI代码解释
复制
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;
    }
}
方式五:内部枚举类

代码语言:txt
AI代码解释
复制
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(){}
}

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式-单例模式
模式定义 确保一个类最多只有一个实例,并提供一个全局访问点。 单例模式分为饿汉式和懒汉式。 懒汉式单例模式:在类加载时不初始化。 饿汉式单例模式:在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快。 饿汉式-线程安全 1 /** 2 * 饿汉式单例模式(线程安全) 3 */ 4 public class Singleton { 5 //static单例变量 6 private static Singleton singleton = new Singleton()
武培轩
2018/04/18
5600
Java设计模式(一)-单例模式
单例模式(Singleton Pattern) 是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
joshua317
2021/11/24
8180
Java设计模式(一)-单例模式
灵活多变的单例模式
在软件工程领域,设计模式是一套通用、可复用的解决方案,用于解决在软件设计过程中产生的通用问题。它不是一个可以直接转成源码的设计,是一套开发人员在软件设计过程中应当遵循的规范。也就是说没有设计模式,软件依旧可以开发,只是后期维护可能变得不那么轻松。设计模式就是为了简化你的维护成本提升性能而设计的,不同的设计模式适用场景各异,具体的结合实际场景对待。
啃饼思录
2021/11/02
3250
设计模式—单例模式
对于常用的23种设计模式,这里笔者会根据自己学习和出现频率、重要程度进行学习记录吧。并且每种设计模式可能会根据暂时需求侧重学习深浅。
bigsai
2020/03/20
2690
设计模式—单例模式
单例模式 java 三种写法_双重锁的单例模式
单例模式有多种写法,都有各自的优缺点,最常见的优缺点就是【懒汉和饿汉】的比较,以及是否线程安全
全栈程序员站长
2022/09/22
5070
剑指offer__1__Singleton模式
小结:不建议使用双重锁判定机制,单例对象、资源占用少,枚举要比饿汉好,目前用的较多的是枚举。
用户6055494
2019/08/20
2270
5种单例模式的Java实现[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/156983.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/08
3090
5种单例模式的Java实现[通俗易懂]
浅淡Java设计模式之单例模式
什么是单例模式? 保证一个类仅有一个实例,并提供一个访问它的全局访问点. java中的单例:一个类有且仅有一个实例,并且自行实例化向整个系统提供。
一头小山猪
2020/06/15
4140
设计模式--单例模式
1 饿汉式(静态变量) package com.shi.design.singleton; /** * 单例模式:1 饿汉式(静态变量) * @author shiye * */ public class Singleton1 { public static void main(String[] args) { Singleton singleton1 = Singleton.getInstance(); Singleton singleton2 = Singleton.getInst
用户5927264
2019/08/12
3520
设计模式--单例模式
【单例模式】饿汉式,懒汉式?JAVA如何实现单例?线程安全吗?
.29.
2023/10/25
2380
Java几种单例模式的实现与利弊
多线程环境下无法保证单例效果,会多次执行 instance=new Singleton(),需要考虑到多线程
用户1154259
2018/09/21
6500
详解设计模式@单例的进化之路
单例模式(Singleton Pattern)是设计模式中一个重要的模式之一,是确保一个类在任何情况下都绝对只有一个实例。单例模式一般会屏蔽构造器,单例对象提供一个全局访问点,属于创建型模式。
堆栈哲学
2023/03/08
2550
详解设计模式@单例的进化之路
你敢说自己了解单例模式?
  最近在学习设计模式,在看到单例模式的时候,我一开始以为直接很了解单例模式了,实现起来也很简单,但是实际上单例模式有着好几个变种,并且多线程中涉及到线程安全问题,那么本文我们就来好好聊聊单例模式,说一下经典三种实现方式:饿汉式、懒汉式、登记式。并且解决掉多线程中可能出现的线程安全问题。
阿豪聊干货
2018/08/09
3380
你敢说自己了解单例模式?
01.单例模式设计思想
本文详细介绍了单例模式的设计思想及其应用。首先阐述了单例模式的基本概念、特点与定义,并探讨其适用场景与常见问题。接着深入分析了为何使用单例模式,包括处理资源访问冲突和表示全局唯一类。随后详细讲解了几种常见的单例实现方式,如饿汉式、懒汉式、双重检查锁定、静态内部类及枚举等,对比了各自优缺点。最后讨论了单例模式可能带来的问题,如对OOP不友好、隐藏依赖关系、扩展性差等,并提出了一些替代解决方案。文章内容丰富,适合希望深入了解单例模式及其应用的读者。
杨充
2024/10/14
1570
单例模式(下)---聊一聊单例模式的几种写法
在上一篇文章 单例模式(上)---如何优雅地保证线程安全问题中,我们采取了懒汉式写法来写我们的单例模式,并且重点讲解了懒汉式中线程安全的问题。这篇我们来讲讲单例模式中的其他几种写法。
帅地
2019/10/13
4450
设计模式---单例模式
当一个Java类第一次被真正使用到的时候静态资源被初始化、Java类的加载和初始化过程都是线程安全的
大忽悠爱学习
2021/11/15
2210
设计模式之单例模式
创建型模式之单例模式(Singleton) 什么是单例模式 该类只有一个实例 构造方法是私有的 有一个获取该类对象的静态方法getInstance() 应用场景 一个国家只有一个主席 如果此时的限定必须是抽象出来的类只能是一个对象,这个时候就需要使用单例模式 懒汉式 什么是懒汉式 懒汉式是当用到这个对象的时候才会创建,即是在getInstance()方法创建这个单例对象 优缺点 只有用到的时候才会创建这个对象,因此节省资源 线程不安全 我们知道一旦我们使用了懒汉式就是在getInstance()方法中创建这
爱撒谎的男孩
2018/05/25
4100
Java常用的设计模式
Creator:创建器,声明工厂方法,工厂方法通常会返回一个Product类的实例对象,而且多是抽象方法
MiChong
2020/09/24
4070
Java常用的设计模式
通俗易懂设计模式解析——单例模式
  在上一节中我们对设计模式进行了一定的介绍及分类。设计模式分为创建型、结构型、行为型。创建型模式——主要负责对象的创建。结构型职责——主要负责处理类与对象的组合。行为型模式——主要负责类与对象交互中的职责的分配问题。今天我们也是讲述介绍创建型模式中的第一个模式——单例模式。
小世界的野孩子
2019/09/11
5950
Java实现多种单例模式SingletonPattern
纠结了好久,要不要写一篇博客记录自己学习单例模式的过程。网上相关博客多的很,好像没什么必要重复造一个老轮子。
张拭心 shixinzhang
2022/05/06
2240
Java实现多种单例模式SingletonPattern
相关推荐
设计模式-单例模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档