2020-10-21

it2025-01-06  10

线程安全问题?

首先线程之间是隔离的,那么什么时候才会出现线程安全问题?

三个字:同时 写; 打比方如下: //双重检验懒汉式单例模式; public class Lanhanshishuangchong {

private static Lanhanshishuangchong lanhanshishuangchong; private Lanhanshishuangchong(){ } public static Lanhanshishuangchong getLanhanshishuangchong(){ if(lanhanshishuangchong==null){ synchronized (Lanhanshishuangchong.class) { if(lanhanshishuangchong==null) { Lanhanshishuangchong lanhanshishuangchong = new Lanhanshishuangchong(); } } } return lanhanshishuangchong; }

}

}

这是普通的懒汉式单例模式。 public class Lanhanshishuangchong {

private static Lanhanshishuangchong lanhanshishuangchong; private Lanhanshishuangchong(){ } public static Lanhanshishuangchong getLanhanshishuangchong(){ if(lanhanshishuangchong==null){ Lanhanshishuangchong lanhanshishuangchong = new Lanhanshishuangchong(); } return lanhanshishuangchong; }

那么在多线程的情况下会出现什么样的问题?

if(lanhanshishuangchong==null){

Lanhanshishuangchong lanhanshishuangchong = new Lanhanshishuangchong();

上面可以看出如果为null那么我们就创建对象;

单线程进来就会第一次访问,就会创建一个对象,

那么如果是多线程访问的情况下呢,多线程会有可能出现的

情况就是当第一个线程正在创建这个对象的时候,第二个

线程进来了,这个时候这个对象还没有创建成功,(不要刻意去想时间这个是肉眼无法看到的,在程序上,它们的时间片都是很小很小的),

那么这个时候就会创建多个对象,违背了单利的模式;

结论1:就是如果一段代码在多线程的情况下,不能保持初衷,那么就存在线程安全问题 通俗讲,就是多线程影响了它单利的原则。对于它自己本身,就是线程安全问题。


我们在看看上面的代码,它解决了多线程的问题。


//双重检验懒汉式单例模式; public class Lanhanshishuangchong {

private static Lanhanshishuangchong lanhanshishuangchong; private Lanhanshishuangchong(){ } public static Lanhanshishuangchong getLanhanshishuangchong(){ if(lanhanshishuangchong==null){ synchronized (Lanhanshishuangchong.class) { if(lanhanshishuangchong==null) { Lanhanshishuangchong lanhanshishuangchong = new Lanhanshishuangchong(); } } } return lanhanshishuangchong; }

}

}


怎么解决的呢?

啥话不说肯定先加锁么。

synchronized (Lanhanshishuangchong.class)

加了锁 就结束了吗?

你以为加了锁就只能一个线程进去,然后第二个线程进来的时候就直接用上面创建的对象吗?

你以为的你以为不是你以为的。

为什么?

你永远要知道有可能发生的事情,在程序中。第一个线程创建了对象,他就一直存在吗?

如果啊两个线程几乎同时访问,那么是有可能线程安全的,否则,第一个都被回收了,这个时候在进来的时候,还是空的,就得还去创建,那么还是会去new,那么两次new的对象就不是一个 对象了。对象地址改变,那么就违背单利的原则,造成线程不安全。

只有再加上 if(lanhanshishuangchong==null) ,才能解决这个问题。

大家说我讲的对吗?多多留言。


最新回复(0)