单例模式分为饿汉式和懒汉式, 单例类的特点是: 确保一个类只能实现一个实例, 自行实例化并向整个系统提供这一实例.
饿汉式就是当类加载的时候, 已经自行实例化了, 线程安全;
饿汉式的代码如下:
- public class EHanSignle {
- // 私有静态类变量
- private static final EHanSignle eHanSignle = new EHanSignle();
- // 私有构造方法, 只能在类的内部实例化
- private EHanSignle() {}
- // 公有静态方法. 供类调用
- public static EHanSignle getInstance() {
- return eHanSignle;
- }
- }
懒汉式就是第一次实例化的时候, 才调用方法实例化自己
懒汉式代码 (线程不安全) 如下所示
- public class LHanSignle {
- private static LHanSignle lHanSignle = null;
- private LHanSignle() {}
- public static LHanSignle getInstance() {
- if(lHanSignle == null) {
- lHanSignle = new LHanSignle();
- }
- return lHanSignle;
- }
- }
为了实现线程安全有三种方法:
第一种就是在 getInstance 的方法上加同步;
- public class LHanSignle {
- private static LHanSignle lHanSignle = null;
- private LHanSignle() {}
- public static synchronized LHanSignle getInstance() {
- if(lHanSignle == null) {
- lHanSignle = new LHanSignle();
- }
- return lHanSignle;
- }
- }
第二种就是双重检查锁定
- public class LHanSignle {
- private static LHanSignle lHanSignle = null;
- private LHanSignle() {}
- public static LHanSignle getInstance() {
- if (lHanSignle == null) {
- synchronized (LHanSignle.class) {
- if (lHanSignle == null) {
- lHanSignle = new LHanSignle();
- }
- }
- }
- return lHanSignle;
- }
- }
第三种方法就是静态内部类(推荐):
- public class LHanSignle {
- private static class loadClass{
- private static final LHanSignle lHanSignal = new LHanSignle();
- }
- private LHanSignle() {}
- public static LHanSignle getInstance() {
- return loadClass.lHanSignal;
- }
- }
设计模式之单例模式(Java 实现)
来源: http://www.bubuko.com/infodetail-2656974.html