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() {  
    }  
}
相关推荐
dingdingfish4 小时前
Bash学习 - 第3章:Basic Shell Features,第5节:Shell Expansions
开发语言·学习·bash
rainbow68894 小时前
C++开源库dxflib解析DXF文件实战
开发语言·c++·开源
不倒翁玩偶4 小时前
IDEA导入新的SpringBoot项目没有启动按钮
java·spring boot·intellij-idea
deepxuan4 小时前
Day7--python
开发语言·python
小小小米粒4 小时前
Maven Tools
java
禹凕4 小时前
Python编程——进阶知识(多线程)
开发语言·爬虫·python
蜡笔小马4 小时前
10.Boost.Geometry R-tree 空间索引详解
开发语言·c++·算法·r-tree
IOsetting4 小时前
金山云主机添加开机路由
运维·服务器·开发语言·网络·php
kali-Myon4 小时前
2025春秋杯网络安全联赛冬季赛-day1
java·sql·安全·web安全·ai·php·web
我是咸鱼不闲呀4 小时前
力扣Hot100系列20(Java)——[动态规划]总结(下)( 单词拆分,最大递增子序列,乘积最大子数组 ,分割等和子集,最长有效括号)
java·leetcode·动态规划