vcjmhg 的个人博客

自律者自由

  menu
66 文章
13419 浏览
2 当前访客
ღゝ◡╹)ノ❤️

设计模式之单例模式

核心作用:保证一个类只有一个实例,并提供一个访问该实例的全局访问点
实现思路:懒汉式、饿汉式、双重检测锁、内部类式、枚举式

  • 懒汉式:直接声明一个私有的静态类成员,然后将其构造器私有化

    • 优点:线程安全,调用效率高
    • 缺点:不能实现预加载
    • 实现过程:
    1public Class LazySingleClass{
    2    private static instance=new LazySingleClass();
    3    private LazySingleClass(){}    //构造器私有化
    4    public static LazySingleClass getInstance(){
    5        return instance;
    6    }
    7}
    
  • 饿汉式:只是声明一个私有的静态类,但不进行初始化,第一次使用的时候进行初始化,要加上同步字段

    • 优点:线程安全,调用效率高,可以实现预加载
    • 缺点:
    • 实现过程:
     1 public Class HungrySingleClass{
     2     private static instance;
     3     private HungrySingleClass(){}
     4     public static HungrySingleClass getInstance(){
     5        if(instance==null){
     6            instance=new HungrySingleClass();
     7         } 
     8         return instance;
     9     }
    10 }
    
  • 双层检测锁

    • 优点:
    • 缺点:由于 jvm 优化的问题,在使用的过程中可能会出错
    • 实现过程
     1 /**
     2 * 双重检测锁
     3 * 该模式将同步加到了if后边提高了调用的效率,但是偶然会出现问题
     4 * @author Admain
     5 *
     6 */
     7public class DoubleLock {
     8private  DoubleLock() {	}
     9private static DoubleLock instance;
    10public static synchronized DoubleLock getInstance(){
    11	//检测两次instance是否为null
    12	if(instance==null){ //第一次检查
    13	synchronized (DoubleLock.class) {
    14		if(instance==null){
    15			instance=new DoubleLock();//第二次检查
    16		}
    17		}	
    18	}
    19	return instance;
    20}
    21}
    22}  
    
  • 内部类方式:通过内部类持有对象来实现单例模式

    • 优点:线程安全,调用效率高,可以延时加载
    • 代码实现
     1public class StaticInnerClass {
     2private StaticInnerClass(){}
     3//内部类天然线程安全,没有同步代码块效率高
     4private static class innerClass{
     5	private static final StaticInnerClass instance=new StaticInnerClass(); 
     6}
     7public static StaticInnerClass getInstance(){
     8	return innerClass.instance;
     9}
    10}  
    
  • 枚举方式实现:定义枚举类型,然后在枚举类体内添加需要的方法

    • 优点:利用了枚举天然单例的的特点,线程安全,调用效率高,可以延时加载
    • 代码实现:
    1public enum EnumStyle {
    2//则个枚举元素,本身就是一个单例模式,但是不能延时加载,可以天然防止反射和反序列化的漏洞
    3instance;
    4//添加自己所需要的操作
    5public void operation(){
    6   System.out.println("操作单例对象");
    7}
    8}  
    

标题:设计模式之单例模式
作者:vcjmhg
地址:https://vcjmhg.top/instance