Balking 模式
Balking 与 Guarded Suspension模式类似,本质上是一种规范化解决“多线程版本if”的方案。两者之间的不同在于,Balking模式在条件变量不满足时,直接退出;而Guarded Suspension模式会等待到条件变量满足时,继续往下执行。
Balking模式典型应用场景,使用synchronized单次初始化
class InitTest{
boolean inited = false;
synchronized void init() {
if(inited) {
return;
}
//省略doInit的实现
doInit();
inited = true;
}
}
上述实现性能上会有一些问题,可以优化为双重检查(Double Check)的形式,
class Singleton {
private static volatile Singleton singleton;
//构造方法私有化
private Singleton() {}
//获取实例(单例)
public static Singleton getInstance() {
//第一次检查
if(singleton == null) {
synchronized(Singleton.class) {
//获取锁后二次检查
if(singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
Balking模式可以使用互斥锁、JUC的Lock和volatile来实现,使用volatile时,必须保证对条件变量的操作是原子操作