10-单例模式(Singleton)

意图

保证一个类只有一个实例,并提供一个访问它的全局访问点

实现

1 懒汉式,线程不安全

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

2 懒汉模式,线程安全

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

3 饿汉式

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

4 双检锁、双重校验锁(DCL)

优点:安全且在多线程情况下保持高性能。

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

5 登记式、静态内部类

描述:这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。
这种方式同样利用了 classloader 机制来保证初始化 instance 时只有一个线程,它跟第 3 种方式不同的是:第 3 种方式只要 Singleton 类被装载了,那么 instance 就会被实例化(没有达到 lazy loading 效果),而这种方式是 Singleton 类被装载了,instance 不一定被初始化。因为 SingletonHolder 类没有被主动使用,只有通过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,从而实例化 instance。想象一下,如果实例化 instance 很消耗资源,所以想让它延迟加载,另外一方面,又不希望在 Singleton 类加载时就实例化,因为不能确保 Singleton 类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化 instance 显然是不合适的。这个时候,这种方式相比第 3 种方式就显得很合理。

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

6 枚举

这种方式是 Effective Java 作者 Josh Bloch 提倡的方式,是实现单例模式的最佳方法。

public class Singleton {
   
 
 
    private Singleton(){
   
 
    }
 
    /**
     * 枚举类型是线程安全的,并且只会装载一次
     */
    private enum Singleton{
   
        INSTANCE;
 
        private final Singleton instance;
 
        Singleton(){
   
            instance = new Singleton();
        }
 
        private Singleton getInstance(){
   
            return instance;
        }
    }
 
    public static Singleton getInstance(){
   
 
        return Singleton.INSTANCE.getInstance();
    }
}

以上例子引用自:https://www.runoob.com/design-pattern/singleton-pattern.html

相关推荐

  1. 10-模式Singleton

    2024-01-08 09:32:05       62 阅读
  2. 模式Singleton Pattern)

    2024-01-08 09:32:05       69 阅读
  3. 设计模式Singleton

    2024-01-08 09:32:05       49 阅读
  4. 模式Singleton Pattern)

    2024-01-08 09:32:05       37 阅读
  5. 设计模式-模式Singleton

    2024-01-08 09:32:05       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-08 09:32:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-08 09:32:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-08 09:32:05       87 阅读
  4. Python语言-面向对象

    2024-01-08 09:32:05       96 阅读

热门阅读

  1. C++动态内存

    2024-01-08 09:32:05       52 阅读
  2. Excel4:数据匹配与连接

    2024-01-08 09:32:05       54 阅读
  3. C语言基本语句介绍

    2024-01-08 09:32:05       60 阅读
  4. 如何判断服务器是否被入侵了

    2024-01-08 09:32:05       59 阅读
  5. Nacos和Eureka的全面对比

    2024-01-08 09:32:05       51 阅读
  6. VCG 创建指定三维Mesh网格

    2024-01-08 09:32:05       58 阅读
  7. 机器学习部分培训资料

    2024-01-08 09:32:05       58 阅读
  8. 阿里云大数据ACA及ACP复习题(61~80)

    2024-01-08 09:32:05       54 阅读
  9. Python高级用法:上下文

    2024-01-08 09:32:05       58 阅读
  10. 找不到模块 “path“ 或其相对应的类型声明

    2024-01-08 09:32:05       56 阅读