Java并发编程之如何在线程中安全地访问一个全局Boolean类型的静态变量?
- 0x00 存在并发问题的代码
- 0x01 修复方案
- 方案一 使用 volatile 关键字
- 方案二 使用 synchronized 同步
- 方案三 使用 AtomicBoolean 原子类
- 0x02 选择策略
在Java中,保证多线程访问全局布尔变量时的读写安全性,需综合考虑可见性和原子性。
0x00 存在并发问题的代码
静态全局变量
public class FunctionSwitchConstant {public static boolean ENABLE_FLAG=false;public void setFlag(boolean value) {ENABLE_FLAG= value;}public boolean getFlag() {return ENABLE_FLAG;}
}
消费队列
public class ShareBlockingDequeConstants {public static volatile BlockingDeque<Runnable> TASK_QUEUE = new LinkedBlockingDeque<>();
}
这里假设在其他地方已经对TASK_QUEUE 做了任务添加。
线程类
@Slf4j
public class ConsumerThread implements Runnable{@Overridepublic void run() {if(log.isInfoEnabled()){log