java 单例模式

单例模式是最简单的设计模式之一。即一个类负责创建自己的对象,同时确保只有单个对象被创建,提供一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

1、懒汉式,线程不安全

java 复制代码
public class Singleton {
	private static Singleton instance;
	private Singleton() {}
	public static Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton()
		}
		return instance;
	}
}

这种方式的特点是线程不安全

2、加锁,线程安全

java 复制代码
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

效率很低,因为在绝大部分情况下并不需要同步

3、饿汉式

常用,但容易产生垃圾对象

java 复制代码
public class Singleton {
	private static Singleton instance = new Singleton();
	private Singleton() {}
	public static Singleton getInstance() {
		return this.instance
	}
}

4、双检锁/双重校验锁(DCL,即double-checked locking)

java 复制代码
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;  
    }  
}

由于只有在很少的情况下会出现需要同步的情况,所以先通过singleton == null 减少进入的概率,然后使用一个类锁保证线程安全

5、静态内部类

java 复制代码
public class Singleton {  
    private static class SingletonHolder {  
    	private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
        return SingletonHolder.INSTANCE;  
    }  
}

静态内部类的加载时机是第一次被引用的时候

getInstance方法返回的始终是静态对象INSTANCE,当这个方法被调用时,SingleTonHolder才在SingleTon的运行时常量池里,把符号引用替换成了直接引用,这时才真正创建了静态对象INSTANCE

因此,静态内部类方法在创建过程中是线程安全的,且延迟了单例的实例化

6、枚举

java 复制代码
public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
}
相关推荐
重生之我在20年代敲代码19 分钟前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
爱上语文21 分钟前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
serve the people24 分钟前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端
qmx_071 小时前
HTB-Jerry(tomcat war文件、msfvenom)
java·web安全·网络安全·tomcat
为风而战1 小时前
IIS+Ngnix+Tomcat 部署网站 用IIS实现反向代理
java·tomcat
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
技术无疆3 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
2401_858286113 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
铁松溜达py3 小时前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy3 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript