单例模式

2018-04-05  本文已影响0人  资深智障



建造型设计模式

简要定义

确保一个类还有一个实例,能够提供一个全局访问点.

实现方法

public class Singleton{
    private static Singleton unipueInstance;// 利用静态变量记录唯一实例
    //其他有用变量
    private Singleton(){}  //把构造器声明为私有,只有Singleleton才能调用

    public static Singleton getInstance(){
        if(uniqueInstance == null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

多线程处理

多线程可能会实例化多个uniqueInstance

改善多线程
public class Singleton{
    private static Singleton unipueInstance = new Singleton();

    private Singleton(){} 

    public static Singleton getInstance(){
        return uniqueInstance;
    }
}
public class Singleton{
    private volatile static Singleton unipueInstance;
    //其他有用变量
    private Singleton(){}  //把构造器声明为私有,只有Singleleton才能调用

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

优缺点

优点
缺点

使用场景

单例模式应用的场景一般发现在以下条件下:
  (1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
  (2)控制资源的情况下,方便资源之间的互相通信。如线程池等。

具体应用

关于volatile 关键字

Java提供了volatile关键字来保证可见性。
  当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。
  而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。

上一篇下一篇

猜你喜欢

热点阅读