主线程修改子线程的标志位,如何避免修改时子线程访问标志位
时间: 2024-09-27 10:15:48 浏览: 28
在主线程修改子线程的标志位时,为了避免子线程在修改过程中直接访问该标志位导致数据不一致,可以采取以下策略:
1. **使用Volatile变量**:在Java中,`volatile`关键字可以确保多线程环境下的可见性和有序性,使得其他线程能立即看到主线程对`volatile`变量的更新。
```java
volatile Boolean isFinished;
new Thread(() -> {
while (!isFinished) { // 使用volatile访问标志位
// ...线程任务...
}
}).start();
```
2. **使用信号量或条件变量**:如`synchronized`, `Lock` API 或 `CountDownLatch`、`Semaphore` 等工具,主线程改变标志后通知等待的子线程。
```java
Semaphore semaphore = new Semaphore(0);
isFinished = true;
new Thread(() -> {
semaphore.acquire(); // 当isFinished变为true时,这里会被释放
// ...线程任务...
}).start();
semaphore.release(); // 主线程修改标志后释放信号
```
3. **使用Future/Callable并发库**:如果子任务返回值不是必需的,可以考虑使用`CompletableFuture`,它可以提供完成通知机制。
```java
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
// ...线程任务...
});
future.whenComplete((result, ex) -> isFinished = true); // 主线程完成后设置标志
```