回想起曾经经历的一次面试,是关于设计模式的。当时自己讲了单例模式,但是并没有全面地把与单例模式相关的线程安全问题理解清楚,当时的场景,哎,往事不堪回首,不过技术终归于技术,是必须掌握滴~
1、单例模式
关于单例模式,就不再详细叙述,想必大家都耳熟能详了,简单回顾下吧。以下是单例模式的一个例子:
public class DoubleCheckedLock {
private static DoubleCheckedLock instance;
public static DoubleCheckedLock getInstance() {
if (instance == null) {
instance=new DoubleCheckedLock();
}
return instance;
}
}
上述的例子,如果是在并发的情况下,就会遇到严重的问题。比如线程A在判断instance为空时,进入new操作,new操作还未完成时,此时线程B也运行到判断instance是否为NULL,那么可能就会造成线程A和线程B都在new,那就违背了单例模式的原本含义了。那么既然需要保证只有一个实例,我们是否可以通过synchronized关键字来解决呢?
public class DoubleCheckedLock {
private static DoubleCheckedLock instance;
public static synchronized DoubleCheckedLock getInstance() {
if (instance == null) {
instance=new DoubleCheckedLock();
}
return instance;