1. 一般的单例模式如下:
class Singleton{
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null){
singleton = new Singleton(); // 创建实例
}
return singleton;
}
}
问题:构造器私有使得外界无法通过构造器实例化Singleton类,要取得实例只能通过getInstance()方法。这是一个延迟加载的版本,即在需要对象的时候才进行实例化操作。该方法在单线程下能够正常运行,但是在多线程环境下会出现由于没有同步措施而导致产生多个单例对象的情况。
原因:在于可能同时有两个线程A和B同时执行到 if 条件判断语句,A判断singleton为空准备执行(//创建实例) 时让出了CPU时间片,B也判断singleton为空,接着执行 (//创建实例),此时创建了一个实例对象;A获取了CPU时间片后接着执行(//创建实例),也创建了实例对象,这就导致多个单例对象的情况
2. 为了解决 1 中出现的问题就是使用synchronized关键字,代码如下:
class Singleton{
private static Singleton singleton;
private Singleton(){}
public static synchronized Singlet