多线程教程(十三) 设计模式之balking(犹豫模式)
一、定义
Balking (犹豫)模式用在一个线程发现另一个线程或本线程已经做了某一件相同的事,那么本线程就无需再做了,直接结束返回
和单例模式有点相似,结合单例模式,就是线程安全的单例模式
二、实现
public class MonitorService {
// 用来表示是否已经有线程已经在执行启动了
private volatile boolean starting;
public void start() {
log.info("尝试启动监控线程...");
synchronized (this) {
if (starting) {
return;
}
starting = true;
}
// 真正启动监控线程...
}
}
调用该模式的代码会先判断是否已经有线程在做这些这些事情,如果已经有做线程在做,就不会创建新的线程重复做相同事情。
结合单例模式创建线程安全的单例模式:
public final class Singleton {
private Singleton() {
}
private static Singleton INSTANCE = null;
public static synchronized Singleton getInstance() {
if (INSTANCE != null) {
return INSTANCE;
}
INSTANCE = new Singleton();
return INSTANCE;
}
}
使用了最粗暴的synchronized锁来实现了线程安全的单例模式,后面章节会对线程安全单例模式进行详细优化,这里主要内容是balking,就不进行优化了。