优点:线程安全,效率高。缺点:不能延时加载,占用资源
package com.liangrui.singletonMode; public class EvilHanStyle { //类初始化时加载对象,加载类,线程安全,但是会造成不必要的资源占用 private static EvilHanStyle instance=new EvilHanStyle(); //禁用构造器 private EvilHanStyle(){ } //获取单例对象的方法 public static EvilHanStyle getInstance(){ return instance; } }2.懒汉式单例模式(对象为空才创建对象,没有了才创建,不提前创建)
优点:实现了延时加载,避免资源占用。缺点:加入同步机制,效率低
此例子还防止了反射和反序列化漏洞
package com.liangrui.singletonMode; import java.io.Serializable; public class LazyStyle implements Serializable { //初始化时不加载对象,实现延时加载 private static LazyStyle instance; //禁用构造器 private LazyStyle(){ //如果对象不为空,则抛出运行时异常,防止了反射的漏洞导致创建新的对象 if (instance!=null){ throw new RuntimeException(); } } //加入同步,避免多线程调用导致创建不同对象,也就导致效率低 public static synchronized LazyStyle getInstance(){ //对象为空时才创建,避免资源占用 if (instance==null){ instance=new LazyStyle(); } return instance; } //添加此方法,返回对象,防止反序列化漏洞创建新对象 private Object readResolve(){ return instance; } }静态内部类式
优点:线程安全,效率高,实现了延时加载,避免不必要的资源占用,这种方式集合了饿汉式和懒汉式的优点
package com.liangrui.singletonMode; public class StaticInnerClassStyle { //创建内部内,实现创建对象 private static class StaticInnerClassStyleInstance{ //定义常量保证对象唯一 private static final StaticInnerClassStyle instance=new StaticInnerClassStyle(); } //禁用构造器 private StaticInnerClassStyle(){ } //不需要使用同步,效率高 public static StaticInnerClassStyle getInstance(){ return StaticInnerClassStyleInstance.instance; } }到此,java中单例模式经典代码案例已完成。有问题随时评论,觉得有用的话记得点个赞哦! 在代码实例中学习知识,学和用兼备,想要长期学习的小伙伴记得关注哦!