【Java并发编程之如何在线程中安全地访问一个全局Boolean类型的静态变量?】
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{
@Override
public void run() {
if(log.isInfoEnabled()){
log