首页 > 其他 > 详细

设计模式之美学习-创建型-单例模式(十五)

时间:2020-03-25 14:47:52      阅读:51      评论:0      收藏:0      [点我收藏+]

说明

从业务概念上,有些数据在系统中只应该保存一份,就比较适合设计为单例类。比如,系统的配置信息类。除此之外,我们还可以使用单例解决资源访问冲突的问题。

饿汉式

在类加载的时候就创建

public class IdGenerator {
    private AtomicLong id = new AtomicLong(0);
    //2.类加载的时候就初始化
    private static final IdGenerator instance = new IdGenerator();
    //1.构造函数私有化
    private IdGenerator() {
    }
    //3.提供一个公共的静态方法
    public static IdGenerator getInstance() {
        return instance;
    }
    public long getId() {
        return id.incrementAndGet();
    }
}

懒汉式

普通版本

public class IdGenerator {
    private AtomicLong id = new AtomicLong(0);
    private static IdGenerator instance;
    //构造哈数私有化
    private IdGenerator() {
    }
    //加锁 避免并发的时候多次创建
    public static synchronized IdGenerator getInstance() {
        if (instance == null) {
            instance = new IdGenerator();
        }
        return instance;
    }
    public long getId() {
        return id.incrementAndGet();
    }
}

缺点:方法加了同步锁避免多线程并发 重复创建,但是当初始化后每次获取都会获取锁,性能不好

双重检测

public class IdGenerator {
    private AtomicLong id = new AtomicLong(0);
    private static IdGenerator instance;
    //构造函数私有化
    private IdGenerator() {}
    public static IdGenerator getInstance() {
        if (instance == null) {
            synchronized(IdGenerator.class) { // 此处为类级别的锁
                //二次判断是为了防止多线程在同步锁等待 第一个释放后 其余进入锁 会重复创建
                if (instance == null) {
                    instance = new IdGenerator();
                }
            }
        }
        return instance;
    }
    public long getId() {
        return id.incrementAndGet();
    }
}

静态内部类

public class IdGenerator {
    private AtomicLong id = new AtomicLong(0);
    //构造函数私有化
    private IdGenerator() {}

    //加载IdGenerator时SingleonHoldre并不会加载
    private static class SingletonHolder{
        private static final IdGenerator instance = new IdGenerator();
    }

    //调用get方你发触发holder加载 
    public static IdGenerator getInstance() {
        return SingletonHolder.instance;
    }

    public long getId() {
        return id.incrementAndGet();
    }
}

 

设计模式之美学习-创建型-单例模式(十五)

原文:https://www.cnblogs.com/LQBlog/p/12565861.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!