1、饿汉式(在类被加载的时候就被实例化)
//饿汉式,天然的线程安全
public class Singleton {
private static final Singleton singleton = new Singleton();
//单例模式,构造方法私有化
private Singleton(){
}
public static Singleton getInstance(){
return singleton;
}
}
2、懒汉式(在调用初始化方法的时候实例化)
//懒汉式,线程不安全
class Singleton02 {
private static Singleton02 singleton02 = null;
private Singleton02(){}
public static Singleton02 getInstance(){
if (singleton02 == null){
singleton02 = new Singleton02();
}
return singleton02;
}
}
3、双重检查锁(懒汉式的线程安全版)
class Singleton03 {
private static volatile Singleton03 singleton03 = null;
private Singleton03() {
}
private static Singleton03 getInstance() {
if (singleton03 == null) {
synchronized (Singleton03.class) {
if (singleton03 == null) {
singleton03 = new Singleton03();
return singleton03;
}
}
}
return singleton03;
}
//测试
public static void main(String[] args) throws InterruptedException {
for ( int i = 0; i < 10; i++){
new Thread(()->{
Singleton03 instance = Singleton03.getInstance();
System.out.println(instance);
},"Thread"+i).start();
}
TimeUnit.SECONDS.sleep(2);
}
}
4、静态内部类(推荐,既线程安全又能实现懒加载)
//静态内部类实现单例模式
class Singleton04 {
static class SingletonInstance{
private static final SingletonInstance singletonInstance = new SingletonInstance();
}
private Singleton04(){}
public static SingletonInstance getInstace(){
//真正调用的时候才会加载内部类并进行实例化
return SingletonInstance.singletonInstance;
}
}
5、枚举类(枚举类加载的时候就会实例化)
//枚举实现单例模式,jvm保证单例和线程安全,但是没有懒加载,适合初始化成本低的场景,业务中的全局状态码
enum SingletonEnum2{
SINGLETON(200,"ok");
//状态码一般定义完就不会发生变化,所以使用final修饰较好
private final Integer code;
private final String message;
SingletonEnum2(Integer code,String msg) {
this.code = code;
this.message = msg;
}
public Integer getCode(){
return code;
}
public String getMessage(){
return message;
}
}
总结
当要使用资源对象式全局唯一的(如系统配置参数,数据库连接池等)这些被频繁使用但是只需要创建一次的时候就可以使用单例模式,单例模式避免了资源的重复创建节省系统资源,推荐使用双检锁和静态内部类实现单例模式,及保证了唯一的实例化,又有懒加载和线程安全。
1008

被折叠的 条评论
为什么被折叠?



