关于线程安全单例模式的探究,大家伙回分析下哇
关于线程安全单例模式的探究,大家伙来分析下哇
所谓的线程安全的单例模式,是指在创建这个对象时的线程安全,并不是使用时的安全,那么这种情况呢,
当第一次加载单例模式后,该单例对象就已经存在,接下来就来了两个线程,A和B,在A获得单例后,对该单例进行了一些修改准备做某事,
但是A还没开始做事的时候,CPU把运行片段分配给了B,此时B也获得该单例,因为单例模式是static,所以B获得的是A修改后的单例对象,
然而,B也需要对该单例对象进行一些修改,在B修改完后CPU又把运行片段给了A,此时A手上的单例对象已不是他修改的单例对象而是B修改后的单例对象,
那么,这个就应该不叫线程安全吧?
我理解的对么?我把静态内部类单例模式的代码贴出来,据说他就是线程安全的懒汉式单例模式
------解决思路----------------------
线程安全只是针对变量来说的,如果线程在调用方法的时候用到的变量都是局部变量, 那就是线程安全的.
你怕初始化的时候有可能出现多个实例的情况
可以这样写
所谓的线程安全的单例模式,是指在创建这个对象时的线程安全,并不是使用时的安全,那么这种情况呢,
当第一次加载单例模式后,该单例对象就已经存在,接下来就来了两个线程,A和B,在A获得单例后,对该单例进行了一些修改准备做某事,
但是A还没开始做事的时候,CPU把运行片段分配给了B,此时B也获得该单例,因为单例模式是static,所以B获得的是A修改后的单例对象,
然而,B也需要对该单例对象进行一些修改,在B修改完后CPU又把运行片段给了A,此时A手上的单例对象已不是他修改的单例对象而是B修改后的单例对象,
那么,这个就应该不叫线程安全吧?
我理解的对么?我把静态内部类单例模式的代码贴出来,据说他就是线程安全的懒汉式单例模式
public class Singleton {
private Singleton(){ }
public static Singleton getInstance()
{
return Nested.instance;
}
//在第一次被引用时被加载
static class Nested
{
private static Singleton instance = new Singleton();
}
}
------解决思路----------------------
线程安全只是针对变量来说的,如果线程在调用方法的时候用到的变量都是局部变量, 那就是线程安全的.
你怕初始化的时候有可能出现多个实例的情况
可以这样写
public class Singleton {
private Singleton(){ }
private static final Integer Lock = new Integer(1);
private static Singleton instance = null;
public static Singleton getInstance() {
if(instance == null){
synchronized (Lock) {
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}