单例模式
来源:互联网 发布:c语言e语言 编辑:程序博客网 时间:2024/05/18 01:42
- public class Singleton {
- private static Singleton instance;
- private Singleton (){}
- public static synchronized Singleton getInstance() {
- if (instance == null) {
- instance = new Singleton();
- }
- return instance;
- }
- }
- public class Singleton {
- private static Singleton instance = new Singleton();
- private Singleton (){}
- public static Singleton getInstance() {
- return instance;
- }
- }
- public enum Singleton {
- INSTANCE;
- public void whateverMethod() {
- }
- }
- public class Singleton {
- private static class SingletonHolder {
- private static final Singleton INSTANCE = new Singleton();
- }
- private Singleton (){}
- public static final Singleton getInstance() {
- return SingletonHolder.INSTANCE;
- }
- }
- 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种,懒汉式/饿汉/枚举/静态内部类/双重校验锁
懒汉:
锁加在方法上,效率低。类不会自动加载,共享数据只在调用getInstance时才实例化。
饿汉
基于classloader机制避免了并发访问的冲突,而且不用加锁,效率较高。但在类加载过程中共享数据即实例化了,未实现lazy load。
枚举
据说是非常好的一种单例模式,解决了并发问题且实现lazy load。但写法诡异,不常用。
静态内部类
较为常用的一种单例。实现了lazy load。在外部类加载时不进行实例化,仅当getInstance()调用时才实例化内部类、实例化内部类中的静态变量。很好的机制,尤其在外部类可能在其他地方被多次使用时。而且是线程安全的,基于classloader的加载机制,内部类的构建依赖于外部类的构造函数,但外部类的构造函数是原子的,因此无需同步。
双重校验锁
也是较为常用的一种单例,但对性能有一定影响。
总而言之,每种单例模式都有自己的适用范围。应根据具体的业务场景进行选择。
阅读全文
0 0
- 单例、单例模式
- 单例模式-多线程单例模式
- 单件模式(单例模式)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- PHP模式-单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 单例模式(单子模式)
- 设计模式-单例模式
- [设计模式] 单例模式
- Windows 2008 R2环境下DHCP服务的安装部署使用
- centos 6.8 + pgsql 9.6 + pg_buffercache
- ContOS 安装jdk
- Java知识点笔记--构造器内部的多态行为
- OpenCV界面(CVUI,跨平台,比QT方便,包括按钮等)
- 单例模式
- Android图片压缩框架-Tiny 集成(抄来的,防止网页没有了,搬到自己家里)
- 图片处理工具-局部像素替换
- Java -D 属性获得
- Java正则表达式特点
- pandas将多个excel合并至一个DataFrame
- Tomcat源码分析--资源映射器Mapper
- angular.copy()功能学习
- 程序员的自我修养之Windows下的动态链接