单例模式会产生线程不安全吗?哪种模式会?如何解决?效率会受到影响吗?如何提升效率?
答:
会
懒汉式
加同步
效率会受到影响
在同步代码块外卖你加上if判断
public static SingleDemo getInstance() {
if(sd==null) {
sd=new SingleDemo();
}
return sd;
}
假设多线程时,有t1和t2两个线程。因为刚开始的时候,满足sd== null,所以t1进入到了创造对象的步骤。这个时候CPU又被t2抢走了,因为还没有产生对象,所以还是满足sd==null条件,因此t2也进来了。因为t1,t2都在产生对象,就会产生两个对象,就不是单例了。
加上同步t1和t2就只能一个一个进入,就不会出现之前的那种情况了。但是运行效率也随之下降。
public static SingleDemo getInstance() {
synchronized (SingleDemo.class) {
if(sd==null) {
sd=new SingleDemo();
}
}
return sd;
}
为了提升效率,可以加入if判断,当sd!=null的是时候直接返回sd,就可以大大提高运行的效率。
public static SingleDemo getInstance() {
if(sd==null) {
synchronized (SingleDemo.class) {
if(sd==null) {
sd=new SingleDemo();
}
}
}
return sd;
}