设计模式笔记 -- 单例模式

简介: 单例模式有五种写法,分别是饿汉式懒汉式双重检查静态内部类枚举

单例模式有五种写法,分别是


饿汉式


懒汉式


双重检查


静态内部类


枚举


但是饿汉式又分两种静态常量和静态代码块,懒汉式又分三种线程不安全的,线程安全(同步方法),线程安全(同步代码块),所以细分下来一共有八种写法。


1,饿汉式(静态常量)

实现原理是通过一个静态方法返回一个静态实例,代码如下


public class Singleton {
    private Singleton(){}
    private final static Singleton singleton = new Singleton();
    public static Singleton getInstance(){
        return singleton;
    }
}

优点:写法简单,在类加载的时候完成实例化,避免了线程同步问题


缺点:在类加载的时候就完成实例化,如果一直没有用的这个类,就造成了内存的浪费


2,饿汉式(静态代码块)

public class Singleton {
    private Singleton(){}
    private static Singleton singleton;
    static {
        singleton = new Singleton();
    }
    public static Singleton getInstance(){
        return singleton;
    }
}

这种方法跟上面静态常量写法的优缺点是一样的


3,懒汉式(线程不安全)

public class Singleton {
    private Singleton(){}
    private static Singleton singleton;
    public static Singleton getInstance(){
        if(singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

优点:不会在你不用的情况下去创建对象


缺点:只能在单线程下使用,多线程情况下if语句中可能多个线程进入,就会创建多个对象


在实际开发中不建议使用


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

在上面代码的基础上加一个synchronize关键字


public class Singleton {
    private Singleton(){}
    private static Singleton singleton;
    public static synchronized Singleton getInstance(){
        if(singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

优点:解决了线程不安全的问题


缺点:效率太低了,每个线程获取实例的时候,执行getInstance方法都要进行同步


在实际开发中,不推荐使用


5,懒汉式(线程安全,同步代码块)

开起来线程安全,其实还是线程不安全的,依旧会可能又两个线程进入if语句中


public class Singleton {
    private Singleton(){}
    private static Singleton singleton;
    public static Singleton getInstance(){
        if(singleton == null){
            synchronized (Singleton.class){
                singleton = new Singleton();
            }
        }
        return singleton;
    }
}


实际开发中,不能使用这种方式


6,双重检查

public class Singleton {
    private Singleton(){}
    private static volatile Singleton singleton;
    public static Singleton getInstance(){
        if(singleton == null){
            synchronized (Singleton.class){
                if(singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}


使用volatile关键字保证可见性和有序性,在同步块外面和里面都进行一次判断,解决了线程安全问题,也解决了懒加载问题


7,静态内部类

采用类加载的机制来保证初始化实例时只有一个线程


静态内部类在Singleton被装载时不会实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类


类的静态属性只会在第一次加载类的时候初始化,JVM帮我们保证了线程的安全,在类初始化时,别的线程是无法进入的


public class Singleton {
    private Singleton(){}
    private static class SingletonInstance{
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance(){
        return SingletonInstance.INSTANCE;
    }
}

优点:保证了线程安全,利用静态内部类的特点实现了懒加载,效率高


8,枚举

enum SingletonEnum{
    INSTANCE;
}

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



在jdk中哪个地方用到了单例模式呢,RunTime类使用饿汉式实现单例模式


相关文章
|
19天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
18天前
|
设计模式 SQL 安全
Java一分钟之-设计模式:单例模式的实现
【5月更文挑战第16天】本文介绍了单例模式的四种实现方式:饿汉式(静态初始化)、懒汉式(双检锁)、静态内部类和枚举单例,以及相关问题和解决方法。关注线程安全、反射攻击、序列化、生命周期和测试性,选择合适的实现方式以确保代码质量。了解单例模式的优缺点,谨慎使用,提升设计效率。
30 3
|
19天前
|
设计模式
【设计模式】张一鸣笔记:责任链接模式怎么用?
【设计模式】张一鸣笔记:责任链接模式怎么用?
18 1
|
19天前
|
设计模式
【设计模式】单例模式的三种实现方式
【设计模式】单例模式的三种实现方式
14 1
|
19天前
|
设计模式 算法 Java
【设计模式系列笔记】设计模式与设计原则
设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 设计原则是一些通用的设计指导方针,它们提供了如何设计一个优秀的软件系统的基本思想和规则。指导着设计者如何组织代码以实现高内聚、低耦合、易扩展和易维护的软件系统。
33 4
|
19天前
|
设计模式 安全 Java
【设计模式学习】单例模式和工厂模式
【设计模式学习】单例模式和工厂模式
|
19天前
|
设计模式 安全 Java
|
19天前
|
设计模式 存储 安全
Java 设计模式:深入单例模式的理解与应用
【4月更文挑战第27天】单例模式是一种常用的设计模式,在 Java 开发中扮演着重要角色。此模式的主要目的是保证一个类只有一个实例,并提供一个全局访问点。
33 0
|
19天前
|
设计模式 JavaScript 前端开发
vue的设计模式_笔记
vue的设计模式_笔记
16 0
|
19天前
|
设计模式 安全 Java
[设计模式Java实现附plantuml源码~创建型] 确保对象的唯一性~单例模式
[设计模式Java实现附plantuml源码~创建型] 确保对象的唯一性~单例模式