本篇文章小编给大家分享一下Java中的八种单例创建方式代码实例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
定义
单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)
使用场景
对于一些需要频繁创建销毁的对象
重量级的对象
经常使用到的对象
工具类对象
数据源
session
单例模式八种方式
饿汉式(静态常量)
代码
/** * 饿汉式(静态常量) * 优势:简单,避免多线程的同步问题 * 劣势:无懒加载,内存浪费 * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ public class Singleton1 { // 私有化构造方法 private Singleton1(){} // 静态常量 private static final Singleton1 singleton1 = new Singleton1(); // 对外提供公共方法 public static Singleton1 getSingleton1(){ return singleton1; } }
分析
优势:简单,避免多线程的同步问题
劣势:无懒加载,内存浪费
饿汉式(静态代码块)
代码
/** * 饿汉式(静态代码块) * 优势:简单,避免多线程的同步问题 * 劣势:无懒加载,内存浪费 * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ public class Singleton2 { // 私有化构造方法 private Singleton2(){} private static final Singleton2 singleton2; // 静态代码块 static { singleton2 = new Singleton2(); } // 对外提供公共方法 public static Singleton2 getSingleton2(){ return singleton2; } }
分析
优势:简单,避免多线程的同步问题
劣势:无懒加载,内存浪费
懒汉式(线程不安全)
代码
/** * 懒汉式(线程不安全) * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ public class Singleton3 { // 私有化构造方法 private Singleton3(){} // 内部属性 private static Singleton3 singleton3; // 对外提供公共方法 public static Singleton3 getSingletons(){ if(singleton3 == null){ singleton3 = new Singleton3(); } return singleton3; } }
分析
优势:起到了懒加载的效果 不会造成内存浪费
劣势:线程不安全 不推荐这种方式的
懒汉式(同步方法)
代码
/** * 懒汉式(同步方法) * 优势:解决了线程同步问题 * 劣势:使用synchronized同步关键字,性能太低 * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ public class Singleton4 { // 私有化构造方法 private Singleton4(){} // 内部属性 private static Singleton4 singleton4; // 对外提供公共方法 public static synchronized Singleton4 getSingleton4(){ if(singleton4 == null){ singleton4 = new Singleton4(); } return singleton4; } }
分析
优势:解决了线程安全问题,
劣势:效率太低
懒汉式(同步代码块)
代码
/** * 懒汉式(同步代码块) * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ public class Singleton5 { // 私有化构造方法 private Singleton5(){} // 内部属性 private static Singleton5 singleton5; // 对外提供公共方法 public static Singleton5 getSingleton5(){ if (singleton5 == null){ synchronized (Singleton5.class){ singleton5 = new Singleton5(); } } return singleton5; } }
分析
优势:起到了懒加载的效果 不会造成内存浪费
劣势:线程不安全 不推荐这种方式的
双重检查锁方式
代码
/** * 双重检查锁机制 * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ public class Singleton6 { // 私有化构造方法 private Singleton6(){} // 内部属性 private volatile static Singleton6 singleton6; // 对外提供公共方法 public static Singleton6 getSingleton6(){ if (singleton6 == null){ synchronized (Singleton6.class){ if(singleton6 == null){ singleton6 = new Singleton6(); } } } return singleton6; } }
分析
实现了懒加载,效率很高,解决了线程安全
静态内部类方式
代码
/** * 静态内部类 * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ public class Singleton7 { // 私有化构造方法 private Singleton7(){} // 内部类 private static class SingleInstance{ public static final Singleton7 singleton7 = new Singleton7(); } // 对外提供公共方法 public static Singleton7 getSingleton7(){ return SingleInstance.singleton7; } }
分析
不会出现线程安全问题 JVM来帮我们保证了线程的安全性
利用静态内部类的特点,效率也很高,
实际开发中推荐使用的
枚举方式
代码
定义单例对象
/** * @desc: * @author:liyajie * @createTime:2022/2/11 10:25 * @version:1.0 */ public class Singleton { public void hello(){ System.out.println("hello"); } }
定义枚举实例化单例对象
/** * 枚举方式 * @author:liyajie * @createTime:2022/2/10 15:50 * @version:1.0 */ enum Singleton8 { // 相当于public static final Singleton8 INSTANCE; // 保证了枚举实例只能被实例化一次 INSTANCE; // 定义单例变量 private Singleton singleton; // 枚举构造方法,该构造方法是private,执行构造方法的时候,同时创建我们的单例对象 Singleton8() { singleton = new Singleton(); } // 对外提供公共方法 public Singleton getSingleton() { return singleton; } }
使用方法Singleton8.INSTANCE.getSingleton()即可获取我们的单例对象了
分析
简单,避免了线程安全问题
实际开发中推荐使用的
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整