单例的几种实现方式
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
使用单例需要注意的关键点
1、将构造函数访问修饰符设置为private
2、通过一个静态方法或者枚举返回单例类对象
3、确保单例类的对象有且只有一个,特别是在多线程环境下
4、确保单例类对象在反序列化时不会重新构建对象
单例模式的几种写法
1.饿汉式(静态常量)
class Singleton{
//1.构造器私有化,外部不能new
private Singleton(){
}
//2.本类内部创建对象实例
private final static Singleton instance = new Singleton();
//3.提供一个公有的静态方法,返回实例对象
public static Singleton getInstance(){
return instance;
}
}
2、饿汉式(静态代码块)
class Singleton {
//1.构造器私有化,外部不能new
private Singleton() {
}
//2.本类内部创建对象实例
private static Singleton instance;
static { //在静态代码块中,创建单例对象
instance = new Singleton();
}
//3.提供一个公有的静态方法,返回实例对象
public static Singleton getInstance() {
return instance;
}
}
3、懒汉式(线程不安全)
class Singleton {
private static Singleton instance;
private Singleton() {
}
//提供一个静态的公有方法,当使用到方法时,才去创建instance
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
4、懒汉式(线程安全,同步方法)
class Singleton {
private static Singleton instance;
private Singleton() {
}
//提供一个静态的公有方法,加入同步处理的代码,解决线程安全问题
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
5、懒汉式(双重校验,线程安全,效率较高,推荐使用)
class Singleton {
private static volatile Singleton instance; //volatile保证线程间的可见性
private Singleton() {
}
//提供一个静态的公有方法,加入双重检查代码,解决线程安全问题,同时解决懒加载问题
//同时保证了效率,推荐使用
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
6、静态内部类完成,推荐使用
class Singleton {
private Singleton() {
}
//写一个静态内部类,该类中有一个静态属性Singleton
//在调用getInstance()方法时,静态内部类才会被装载,保证了懒加载;同时类加载是线程安全的
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
//提供一个静态的公有方法,直接返回SingletonInstance.INSTANCE
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
7、使用枚举,推荐使用
enum Singleton{
INSTANCE; //属性
public void doSomething(){
System.out.println("do something");
}
}
————————————————
版权声明:本文为CSDN博主「繁臣」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:
https://blog.csdn.net/qq_35028940/article/details/115510972
粉丝福利:Java从入门到入土学习路线图
👇👇👇
👆长按上方微信二维码 2 秒
感谢点赞支持下哈
评论