线程安全的单例模式

来源:互联网 发布:淘宝千纸鹤什么档次 编辑:程序博客网 时间:2024/06/03 17:34

在我们项目中,很多时候需要程序只存在一个唯一实例。通常在项目中我会把单例模式写成如下形式

public class Singleton {
private static Singleton mSingleton;


private Singleton() {


}


public static Singleton getInstance() {
if (mSingleton == null) {
mSingleton = new Singleton();

}
return mSingleton;
}
}

通常以这种形式返回一个类的唯一实例,然而在Android开发中经常如果多线程开发。上面这种写法就不适合在多线程模式下运行了,会涉及到线程安全问题。因为很有可能两个线程同时会访问到getInstance()来创建实例。

因此我们使用线程同步来避免这一问题:

public class Singleton {
private static Singleton mSingleton;


private Singleton() {


}


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

如果多个线程访问时synchronized关键字,会一次只允许一个线程访问,其他线程先等待,恩,这确实避免了多线程同时访问带来的风险。那么又出现另一个问题,假如我项目复杂,线程多访问这个单例时一次只允许一个线程访问,其他线程等待,那性能上又存在很大的问题,每次实例时都得同步锁。

于是我们使用双从锁定,只在第一次类被实例化时判断 同步锁,解决线程安全,又解决效率问题

public class Singleton {
private static Singleton mSingleton;


private Singleton() {


}


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

0 0
原创粉丝点击