大数跨境

设计模式分享之-单例模式

设计模式分享之-单例模式 易软国际
2024-02-24
3

设计意图:使用单例模式,可以保证为一个类只生成唯一的实例对象.类图如上.单例分为如下二种:

1)饿汉式-类装载的时候就会创建类的实例

public class Singleton {

    private static Singleton singleton= new Singleton();

    /**

     * 私有构造方法

     */

    private Singleton(){}

    /**

     * 静态的全局访问方法

     */

    public static Singleton getSingleton(){

        return singleton;

    }

}

2)懒汉式-不创建实例,等到需要用到实例的时候再创建

public class Singleton {

private static Singleton singleton = null;

/**

* 私有默认构造方法

*/

private Singleton() {

}

/**

* 静态的全局访问方法

*/

public static Singleton getSingleton() {

if (null == singleton) {

singleton = new Singleton();

}

return singleton;

}

}

问题懒汉式在并发进入null == singleton可能会创建多个对象,为了线性安全

public class Singleton {

private static Singleton singleton = null;

/**

* 私有默认构造方法

*/

private Singleton() {

}

/**

* 静态的全局访问方法

*/

public static synchronized Singleton getSingleton() {

if (null == singleton) {

singleton = new Singleton();

}

return singleton;

}

}

问题:synchronized  多个线程同时需要获取singleton实例时只能一个一个线程排队执行,降低了性能,为了提高性能进行双重检查如下

public class Singleton {

private volatile static Singleton singleton = null;

/**

* 私有默认构造方法

*/

private Singleton() {

}

/**

* 静态的全局访问方法

*/

public static Singleton getSingleton() {

//先检查实例是否已创建,如果未创建才进入同步块

if (null == singleton) {

synchronized (Singleton.class) {

//再次检查实例是否已创建,如果真的未创建才创建实例

if (null == singleton) { 

singleton = new Singleton();

}

}

}

return singleton;

}

}

【声明】内容源于网络
0
0
易软国际
技术资讯分享,网络技术,技术服务,计算机系统销售及技术开发
内容 1
粉丝 0
易软国际 技术资讯分享,网络技术,技术服务,计算机系统销售及技术开发
总阅读2
粉丝0
内容1