码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2019-02-27 22:11:16      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:导致   instance   单例   内部类   情况下   ==   效率   public   同步问题   


第一种 懒汉式,线程不安全,无法在多线程工作

/**

 * 懒汉式,lazy loading明显,线程不安全,无法多线程使用

 */

public class SinglePattern {

    private static SinglePattern singlePattern;

    public static SinglePattern getInstance() {

        if (singlePattern == null) {

            singlePattern = new SinglePattern();

        }

        return singlePattern;

    }

}

 

第二种 懒汉式,线程安全,但是锁的力度较大,易造成线程阻塞,导致效率低下

/**

 * 懒汉式,线程安全,多线程可使用,但锁的力度较大,

 * 易造成阻塞,效率低下

 */

public class SinglePattern {

    private static SinglePattern singlePattern;

    public static synchronized SinglePattern getInstance() {

        if (singlePattern == null) {

            singlePattern = new SinglePattern();

        }

        return singlePattern;

    }

}

 

第三种,饿汉式,利用ClassLoder机制避免了多线程的同步问题,但是没有Lazy loading的效果

/**

 * 饿汉式,基于ClassLoader机制避免了多线程同步问题

 * 但是未达到lazy loading的效果

 */

public class SinglePattern {

    private static SinglePattern mSinglePattern = new SinglePattern();

    private static SinglePattern getInstance() {

        return mSinglePattern;

    }

}

 

第四种,饿汉式,和第三种无较大差别,在类初始化的时候实例化对象

public class SinglePattern {

    private static SinglePattern singlePattern;

    static {

        singlePattern = new SinglePattern();

    }

    public static SinglePattern getInstance() {

        return singlePattern;

    }

}

 

第五种,饿汉式,静态内部类形式,可以达到Lazy loading

/**

 * 饿汉式,静态内部类

 * 这种方式同样利用Classloader机制,但是这种方式,可以避免在SinglePattern类加载的情况下,不被实例化

 * 只有通过主动调用getInstance()方法的时候才会调用SinglePatternHolder初始化实例

 * 可以达到Lazy loading

 */

public class SinglePattern {

    private static class SinglePatternHolder {

        private static SinglePattern singlePattern = new SinglePattern();

 

    }

    public static SinglePattern getInstance() {

        return SinglePatternHolder.singlePattern;

    }

}

 

第六种:双重校验锁 懒汉式,线程安全

/**

 * 懒汉式加强版,将Synchronized关键字放到getInstance方法里,同时mSinglePattern加了volatile关键字

 * 既避免了多线程问题,又不降低效率

 * 但是volatile关键字也有性能问题,不建议大量使用

 */

public class SinglePattern {

    private volatile static SinglePattern mSinglePattern;

    public static SinglePattern getInstance() {

        if (mSinglePattern == null) {

            synchronized (SinglePattern.class) {

                if (mSinglePattern == null) {

                    mSinglePattern = new SinglePattern();

                }

            }

        }

        return mSinglePattern;

    }

}

 

第七种,为枚举,

 

单例模式

标签:导致   instance   单例   内部类   情况下   ==   效率   public   同步问题   

原文地址:https://www.cnblogs.com/nangongyibin/p/10447246.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!