并发访问单例懒汉式是否有问题?
答:1、多线程中,单例懒汉式有安全问题。
假如有一个线程进来判断s是否为空,结果s==null准备去给s赋值;这时,第二个线程切换进来执行,将s赋值后,第一个线程又将s赋值,覆盖了第二个线程的操作,就会出现安全问题。
怎么解决?
2、用同步代码块和同步函数都能解决此问题,但效率稍低;
可以用双重判断来减少判断锁的次数。当一个线程拿到“锁”后,将对s赋值,第二线程没有“锁”,所以不能给s赋值,当第一个线程赋值成功后,第二个线程会发现s!=null,所以再次赋值操作不会发生,安全问题得以解决,而且下次再有线程进入时,就不会再判断锁,只判断第一个s是否null的条件即可 。效率提高了。 |