终止模式之两阶段终止
// 停止标记用 volatile 是为了保证该变量在多个线程之间的可见性
// 我们的例子中,即主线程把它修改为 true 对 t1 线程可见
class TPTVolatile {
private Thread thread;
private volatile boolean stop = false;
public void start(){
thread = new Thread(() -> {
while(true) {
Thread current = Thread.currentThread();
if(stop) {
log.debug("料理后事");
break;
}
try {
Thread.sleep(1000);
log.debug("将结果保存");
} catch (InterruptedException e) {
}
// 执行监控操作
}
},"监控线程");
thread.start();
}
public void stop() {
stop = true;
thread.interrupt();
}
}

同步模式之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;
}
}
本文介绍了Java中的两种并发控制模式:终止模式的两阶段终止和同步模式的Balking。在终止模式中,通过volatile确保线程间的可见性,实现线程安全的停止。同步模式的Balking则避免了重复执行相同任务的情况,确保资源的有效利用。同时, volatile关键字在单例模式中的应用也得到了展示,保证了线程安全的单例创建。
1万+

被折叠的 条评论
为什么被折叠?



