单例的几种写法
admin
2024-05-18 23:09:10
0

1.饿汉式

类加载时进行实例化

优点:简单

缺点:不管是否使用都会实例化,浪费内存

public class Singleton {//构造器私有化 防止外部实例private Singleton() {}private static final Singleton SINGLETON = new Singleton();public static Singleton getInstance(){return SINGLETON;}
}

2.懒汉式

用synchronized对方法加锁

优点:使用时才实例化,节省内存

缺点:方法上加锁,代价大

public class Singleton {//构造器私有化 防止外部实例private Singleton(){}private static  Singleton SINGLETON;public static synchronized Singleton getInstance(){if (SINGLETON == null){SINGLETON = new Singleton();}return SINGLETON;}
}

3.双重校验(懒汉式)

用synchronized对代码块中加锁。

volatile作用:

有序性:防止指令重排,不加可能会产生半初始化对象(加载了但没有执行构造函数)

可见性:保证内存一致性,只有主存一份数据。

优点:使用时才实例化,节省内存

缺点:加锁,代价大,虽然比方法加锁代价小,但是仍然需要加锁。另外比较复杂

public class Singleton {//构造器私有化 防止外部实例private Singleton(){}// volatileprivate static volatile Singleton SINGLETON;public static Singleton getInstance(){if (SINGLETON == null){synchronized(Singleton.class){SINGLETON = new Singleton();}}return SINGLETON;}
}

4.静态内部类(推荐写法)

在静态内部类中实例化对象

优点:使用时才实例化,节省内存,而且不用加锁也能保证线程安全

缺点:复杂

public class Singleton {//构造器私有化 防止外部实例private Singleton(){}private static Singleton singleton;public static Singleton getInstance(){return SingletonHander.singleton;}private static class SingletonHander{private static final Singleton singleton = new Singleton();}
}

5.枚举(推荐写法)

Effective Java作者Josh Bloch 提倡的方式。

简单,现成安全,所用单例实现中唯一一种不会被破坏的单例实现模式。

public enum Singleton {INSTANCE;
}

相关内容

热门资讯

打发时间一元一分红中麻将跑得快... 认准微——as099055或as022055——客服扣675434346免押%D%A
(盘点十款)1元1分正规麻将群... 正规广东红中癞子麻将,15张跑得快,一元一分群,24小时不熄火
哪里有熊猫一元一分广东麻将上下... +薇:mj08522或hz05832游戏类型:单挑,多人,亲友圈模式、秒上下,所有用户都是微信实名制...
“发慌!””清友会管清友“是陷... 网恋有风险,恋爱需谨慎!“他们”通过网页,社交软件,等形式发布有色广告,诱骗点击链接下载APP,随即...