线程安全又不堵塞的单例模式

来源:互联网 发布:vscode 酷炫插件 编辑:程序博客网 时间:2024/04/30 08:31

单例模式,我们平常写的有好几种,下面有其中的五种

/**

 * 单例模式1,存在线程不安全问题,若不考虑线程安全可以用
 *
 * @author tarena
 *
 */
class Singleton1 {
    private static Singleton1 singleton;

    private Singleton1() {
    }

    public static Singleton1 getInstance() {
        if (singleton == null) {
            singleton = new Singleton1();
        }
        return singleton;
    }

}


--------------------------------------------------------------------------------------------------------------------------------------



/**
 * 单例模式2,线程安全了,但会因为线程同步,引起线程堵塞
 * 若是不考虑大并发情况下,也可以用。
 * @author tarena
 *
 */
class Singleton2 {
    private static Singleton2 singleton;

    private Singleton2() {
    }

    public synchronized static Singleton2 getInstance() {
        if (singleton == null) {
            singleton = new Singleton2();
        }
        return singleton;
    }
}


--------------------------------------------------------------------------------------------------------------------------------------



/**

 * 单例模式3,线程安全了,线程同步访问速度也优化了些,但在一开始时的并发还是会出现堵塞
 *
 * @author tarena
 *
 */
class Singleton3 {
    private static Singleton3 singleton;

    private Singleton3() {
    }

    public static Singleton3 getInstance() {
        if (singleton == null) {
            synchronized (Singleton3.class) {
                if (singleton == null) {
                    singleton = new Singleton3();
                }
            }
        }
        return singleton;
    }
}


--------------------------------------------------------------------------------------------------------------------------------------



/**
 * 单例模式4,线程安全了,并发访问速度更快了,
 *  缺点:假如对象比较大,类加载时就创建了此对象,假如不使用,就可能长时间占用内存。
 * @author tarena
 *
 */
class Singleton4 {//非大对象时用
    private static final Singleton4 singleton=new Singleton4();
    private Singleton4(){
        
    }
    public static Singleton4 getInstance() {
        return singleton;
    }

}


--------------------------------------------------------------------------------------------------------------------------------------



/**
 * 单例模式5,线程安全了,并发访问速度更快了
 *
 * @author tarena
 *
 */
class Singleton5 {//大对象时,就用这种
    private Singleton5(){
    }
    
    //什么时候需要什么时候构建实例。
    static class Lazy{
        private static final Singleton5 singleton=new Singleton5();
    }
    public static Singleton5 getInstance() {
        return Lazy.singleton;

    }

}


以上五种供参考学习,推荐用第五种。




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 点痣留下了疤怎么办 危险三角区长痘痘怎么办 挤了危险三角区怎么办 三角区长痘挤了怎么办 三角区发红长痘怎么办 激光祛斑碰水了怎么办 激光打痣留下坑怎么办 点痣之后留下坑怎么办 去痣留下的红印怎么办 激光点痦子留疤怎么办 激光点痣的疤痕怎么办 做完眉毛碰水了怎么办 脸上疤掉了有坑怎么办 结痂不小心抠掉怎么办 脸上肉松弛怎么办19岁 点痣留下来的疤怎么办 激光祛斑的红印怎么办 脸上疤掉了红印怎么办 痘痘发炎了红肿怎么办 脸上的斑越来越多了怎么办 点痣留下的疤痕怎么办 额头又高又大怎么办 脸太长额头太高怎么办 动车因台风停运怎么办 爸妈50了要离婚怎么办 鸿利彩票黑了钱怎么办 忘了锁屏图案怎么办 黄金被水银沾上怎么办 被股东了我该怎么办 异地恋没话题聊怎么办 谈了半年分手了怎么办 博士6年没毕业怎么办 发现孩子早恋家长应该怎么办 异地恋想嘿嘿嘿怎么办 妈妈溜冰溜大了怎么办 皮鞋被雨水泡了怎么办 老婆提出离婚我不想离怎么办 极度缺爱的人怎么办 生二胎住院大宝怎么办 爸妈偏心我该怎么办 无创21体高风险怎么办