Java6种单例模式写法

单例模式

复制代码
某个类任何情况下只有一个实例,并提供一个全局访问点来获取该实例。

Java6种单例模式:2种懒汉式,2种饿汉式 ,静态内部类 ,枚举类

懒汉式

synchronized+延迟加载

java 复制代码
public class Singleton {
    private static Singleton instance;
    private Singleton(){}

    public static synchronized Singleton getInstance(){ //synchronized锁住getInstance方法
        if (instance==null) {  //延迟加载
            instance = new Singleton();
        }
        return instance;
    }
}

volatile+synchronized双检锁

java 复制代码
public class Singleton {
    private volatile static Singleton instance; //volatile修饰实例
    private Singleton(){}

    public static  Singleton getInstance(){
        if (instance==null) {
            synchronized(Singleton.class){   //synchronized锁住Singleton对象
                if (instance==null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

饿汉式---类加载时触发实例化,避免了多线程同步问题

类加载时初始化静态实例

java 复制代码
public class Singleton {
    private static Singleton instance = new Singleton(); //类加载时初始化静态实例

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance; //直接返回加载好的静态实例
    }
}

在静态代码块里初始化实例

java 复制代码
public class Singleton {
    private static Singleton instance = null;  

    static{                             
        instance = new Singleton();  //在静态代码块里初始化实例
    }

    private Singleton() {
    }

    public static Singleton getInstance() {

        return instance;
    }
}

静态内部类方式---实现了延迟加载

调用静态内部类时,在静态内部类里初始化实例

java 复制代码
public class Singleton {

    //定义静态内部类
    private static class InnerSingleton {
        private static final Singleton INSTANCE = new Singleton(); //初始化完成Singleton类静态实例
    }

    private Singleton() {
    }

    public static Singleton getInstance() {

        return InnerSingleton.INSTANCE; //返回静态内部类里的静态实例
    }
}

枚举类方式--既能避免多线程同步问题,又能防止反序列化重新创建对象

创建一个枚举,枚举成员为INSTANCE。使用枚举类.INSTANCE即可获取实例

java 复制代码
package acc;

public enum Singleton {

    INSTANCE; //定义1个唯一的成员INSTANCE

    //枚举类里的公共方法
    public  void  doSomething() {
        System.out.println("r2323t23");
    }
}

public class TestSingleton {
    public static void main(String[] args) {
        //使用枚举类.INSTANCE即可获取实例
        Singleton.INSTANCE.doSomething();
    }
}
相关推荐
齐齐大魔王9 分钟前
linux-线程编程
java·linux·服务器
我真会写代码40 分钟前
Redis核心特性详解:事务、发布订阅与数据删除淘汰策略
java·数据库·redis
kcuwu.1 小时前
Python面向对象:封装、继承、多态
开发语言·python
IT 行者1 小时前
LangChain4j 集成 Redis 向量存储:我踩过的坑和选型建议
java·人工智能·redis·后端
一定要AK1 小时前
Java流程控制
java·开发语言·笔记
河西石头1 小时前
分享python项目与开源python项目中的效率法宝--requirements文件的使用
开发语言·python·requirements文件·批量安装python依赖·python虚拟环境配置
不懒不懒1 小时前
【卷积神经网络作业实现人脸的关键点定位功能】
开发语言·python
321.。1 小时前
Linux 进程控制深度解析:从创建到替换的完整指南
linux·开发语言·c++·学习
酉鬼女又兒1 小时前
零基础快速入门前端Web存储(sessionStorage & localStorage)知识点详解与蓝桥杯考点应用(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·职场和发展·蓝桥杯·html