关于多线程在简单的懒汉模式下线程安全问题的解决

来源:互联网 发布:量化投资算法 编辑:程序博客网 时间:2024/06/03 19:04

一个简单的懒汉模式,例如:
public class SingleTonDemo {

public static void main(String[] args) {    // TODO Auto-generated method stub    SingleTon singleTong1=SingleTon.getInstance();    SingleTon singleTong2=SingleTon.getInstance();    System.out.println(singleTong1+" "+singleTong2);}

}
//单例类——懒汉模式
class SingleTon{
private static SingleTon singleTon=null;

private SingleTon() {    System.out.println("懒汉模式");}public static SingleTon getInstance(){    if(singleTon==null){        singleTon=new SingleTon();    }    return singleTon;}

}
这样单例类被调用的时候仅会提供一个实例,可是在运用上多线程后却不一定了
代码如下:
public class SingleTonDemo {

public static void main(String[] args) {    // TODO Auto-generated method stub    SingleTonThread STT=new SingleTonThread();    Thread thread1=new Thread(STT);    Thread thread2=new Thread(STT);    thread1.start();    thread2.start();}

}
//线程类
class SingleTonThread implements Runnable{

//重写run方法@Overridepublic void run() {    SingleTon.getInstance();}

}

//单例类——懒汉模式
class SingleTon{
private static SingleTon singleTon=null;

private SingleTon() {    System.out.println("懒汉模式");}public static SingleTon getInstance(){    if(singleTon==null){        singleTon=new SingleTon();    }    return singleTon;}

}
这样的情况下,运行会发现单例类提供了两个实例,那么这个单例模式就存在安全问题了,为了解决问题,只需要将单例类的getInstance方法做成同步代码块即可

代码如下:
public static SingleTon getInstance(){
//多一层判断,减少调用synchronized关键字的次数,提高代码效率
if (singleTon==null) {
//由于是在静态方法内,所以无法使用this关键字锁定当前类,所以使用class模板类对象
synchronized (SingleTon.class) {
if(singleTon==null){
singleTon=new SingleTon();
}
}
}
return singleTon;
}
这样就不会出现懒汉模式创建多个实例的问题了

本人新手,如若有错误或需要改进的地方,还请各位大神指点。

阅读全文
0 0
原创粉丝点击