23种设计模式(新手)-9单例模式

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)

饿汉式

1)构造器私有化

2)类的内部创建对象

3)向外暴露一个静态的公共方法

4)代码实现

优点:写法简单,在类转载就完成了实例化。避免了线程同步问题

缺点:在类装载的时候就完成了实例化,没有达到Lazy Loading的效果。如果从始至终从未用过这个实例,则会造成内存的浪费

java 复制代码
package src.design0Model1Danli.ehai1;

public class design7 {
    public static void main(String[] args) {
        //测试
        Singleton instance = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        System.out.println(instance==instance2);//true
    }
}
//饿汉式(静态变量)
class Singleton {
    //1.构造器私有化,外部能new
    private Singleton(){}
   //2.本部内部类创建对象实例
    public final static Singleton instance=new Singleton();
    //3.提供一个共有的静态方法,返回实例对象
    public static Singleton getInstance(){
        return instance;
    }
}

静态代码块饿汉式

优缺点与上面相同

java 复制代码
public class design8 {
    public static void main(String[] args) {
        //测试
        Singleton instance = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        System.out.println(instance==instance2);//true
    }
}
//饿汉式(静态变量)
class Singleton {
    //1.构造器私有化,外部能new
    private Singleton(){}
    //2.本部内部类创建对象实例
    public static Singleton instance;
    static {//在静态代码块中创建单例对象
        instance =new Singleton();
    }
    //3.提供一个共有的静态方法,返回实例对象
    public static Singleton getInstance(){
        return instance;
    }
}

懒汉式线程不安全

优点:起到懒加载的效果

缺点;多线程条件下不可使用

懒汉式线程安全,同步方法

解决线程安全问题

效率太低,

java 复制代码
public class design9 {
    public static void main(String[] args) {

    }
}

class Singleton{
    public static Singleton instance;
    private Singleton(){}
        //提供一个静态的公有方法,加入同步处理的代码,解决线程安全问题
        //即懒汉式
    public static synchronized Singleton getInstance(){
        if (instance==null){
            instance=new Singleton();
        }
        return instance;
    }
}

懒汉式(线程安全,同步代码块)(线程不安全,无意义,不能使用)

双重检查

加入双重检查代码代码,解决线程安全问题,同时解决懒加载问题同时保证了效率,推荐

java 复制代码
public class design10 {
    public static void main(String[] args) {

    }
}

class Singleton{
    public static Singleton instance;
    private Singleton(){}
    //提供一个静态的公有方法,加入双重检查代码代码,解决线程安全问题,同时解决懒加载问题
    //同时保证了效率,推荐
    public static synchronized Singleton getInstance(){
        if (instance==null){
            synchronized (Singleton.class){
                if (instance==null){
                    instance=new Singleton();
                }
            }
        }
        return instance;
    }
}

静态内部类

采用类装载机制来保证初始化实例只有一个线程,类的静态属性在只会在第一次加载类的时候初始化,别的线程是无法进入的

避免了线程不安全,利用静态内部类特点实现延迟加载,效率高

java 复制代码
public class design11 {
    public static void main(String[] args) {

    }
}

//静态内部类完成
class Singleton{
    public static Singleton instance;
    //构造器私有化
    private Singleton(){}
    //写一个静态内部类,该类中有一个静态属性Singleton
    private static class SingletonInstance{
        private static final Singleton INSTANCE = new Singleton();
    }
    //提供一个静态的公有方法,直接返回成员变量
    public static synchronized Singleton getInstance(){
      return SingletonInstance.INSTANCE;
    }
}

枚举

借助JDK1.5中添加的枚举来实现单例模式。不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象

javascript 复制代码
public class design12 {
    public static void main(String[] args) {}
}
//使用枚举可以实现单例
enum Singleton{
    INSTANCE;
    public void sayOK(){
        System.out.println("Hello World");
    }
}

在jdk中java.lang.Runtime就是经典的单例模式饿汉式静态常量

相关推荐
小柯南敲键盘几秒前
AI批量翻译Temu商品标题的Python实践
开发语言·人工智能·python
PH = 72 分钟前
SpringBoot使用自动装配编写Start包
java·spring boot·后端
逆境不可逃4 分钟前
Java JUC 同步工具类一次讲透:CountDownLatch、CyclicBarrier、Semaphore、Phaser 与 AQS 共享模式
java·开发语言·python
知识分享小能手6 分钟前
统计学学习教程,从入门到精通,一元线性回归 —— 知识点详解(17)
学习·算法·线性回归
大尚来也22 分钟前
项目上线前必须检查的清单:避开线上重大事故
开发语言
青山是哪个青山24 分钟前
LangChain 1.x 学习笔记(一):为什么需要 LangChain?一文彻底理解 LangChain 生态
笔记·学习·langchain
q275513004226 分钟前
AS717 Type-C转DP 8K方案外维少 AS717电路图
c语言·开发语言
xlq2232228 分钟前
高并发服务器day5
java·服务器·数据库
our_times30 分钟前
【硬核实战】当机器人走进厨房:Java后端如何重构物联网并发与状态一致性`。
java·重构·机器人
cooldream200934 分钟前
AI 时代,前端工程师的“新学习路线“—— 从“学框架“到“用 AI“
前端·人工智能·学习