走进设计模式的世界5:没有例子,没有故事,很严肃-单件模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35165632/article/details/83786747

单件模式:

单件模式:确保一个类只有一个实例,并提供一个全局访问点。

解释:单件模式 确保程序中一个类最多只有一个实例。单件模式也提供访问这个实例的全局点。在java中实现单件模式需要有私有的构造器、一个静态方法和一个静态变量。确定在性能和资源上的限制,然后小心的选择适当的方案来实现单件,以解决多线程问题(我们必须认定所有的程序都是多线程的)。jdk5 之前的双重检查锁单例会失效。如果使用多个类加载器单件模式也会失效。

以下是一个简单的单件例子

/**

    简单的单件实现

**/
public class Single{
    // 一个静态变量
    private static Single single;
    // 一个私有的构造方法
    private Single(){};
    // 一个静态方法
    private Single getInstance(){
        if(single!=null){
            single = new Single();
        }
        return single;
    }
}

上面这个例子简单确完整的实现了单件模式,但是却存在多线程的隐患。所以我们进行了修改,让获取实例的方法多线程和也可用。

/**

    锁机制简单的单件实现

**/
public class Single{
    // 一个静态变量
    private static Single single;
    // 一个私有的构造方法
    private Single(){};
    // 一个静态方法(对获取的实例加锁)
    private synchronized Single getInstance(){
        if(single!=null){
            single = new Single();
        }
        return single;
    }
}

这样解决了多线程的问题,但是新的问题又出现了....就是效率问题,每次获取实例就有可能被阻塞。如何进行优化呢?

/**

   双重检查锁单件实现

**/
public class Single{
    // 一个静态变量(运用了volatile关键字,让single的改变直接放到共有内存区,保证变量的可见性)
    private volatile static Single single;
    // 一个私有的构造方法
    private Single(){};
    // 一个静态方法(对获取的实例加锁)
    private synchronized Single getInstance(){
        if(single!=null){
            // 保证只有single属性不为空的时候,对整个类加锁。
            synchronized(Single.class){
                 single = new Single();
            }
        }
        return single;
    }
}

没了。

猜你喜欢

转载自blog.csdn.net/qq_35165632/article/details/83786747
今日推荐