//单例设计模式中懒汉式并发访问的安全问题
//饿汉式 无安全问题
class Single{
private static final Single s = new Single();
private Single(){}
public static Single getInstance(){
return s;
}
}
//懒汉式 错 有安全问题
/*class Single2{
private static Single2 s;
private Single2(){}
public static Single2 getInstance(){
if(s==null){
//--->t1 --->t2在这里线程有可能被抢走CPU
//之后判断s也为空,也会执行下面的语句,就
//不符合单例设计模式的特点了,所以应该写成
//下面一段代码
s = new Single2();
}
return s;
}
}*/
//懒汉式 对
class Single2{
private static Single2 s;
private Single2(){};
public static Single2 getInstance(){
if(s==null){//这个判断条件是优化,可以提高效率,不加也正确
//如果没有上面这个if判断,所有的线程都得执行下面一行代码,即判断锁
//判断锁很浪费资源,加上上面的if判断,至少从第三个线程开始就不用判断锁了
//线程执行完同步代码块中的内容下一个线程才能拿到CPU
//所以这里就保证了单例
synchronized(Single2.class){
if(s==null){
s = new Single2();
}
}
}
return s;
}
}
class Test implements Runnable{
public void run(){
Single s = Single.getInstance();
}
}
class test{
public static void main(String[] args){
Test test = new Test();
Thread t1 = new Thread(test);
Thread t2 = new Thread(test);
t1.start();
t2.start();
}
}
Java——单例设计模式中懒汉式并发访问的安全问题
最新推荐文章于 2021-09-20 23:36:28 发布