您的位置:首页 > 其它

线程安全的单例模式

2015-08-06 10:01 274 查看
在我们项目中,很多时候需要程序只存在一个唯一实例。通常在项目中我会把单例模式写成如下形式

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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: