Java面试题之多线程 多线程中的忙循环是什么?
在多线程编程中,忙循环(Busy Waiting)是一种等待机制,其中一个线程在等待某个条件满足时,不会主动放弃CPU的控制权,而是持续地检查该条件。这种方式通常会导致CPU资源的浪费,因为线程在等待期间会不断地进行循环检查,而不是进入休眠状态。
以下是一个简单的忙循环的示例:
public class BusyWaitExample {
private static volatile boolean condition = false;
public static void main(String[] args) {
Thread waitingThread = new Thread(() -> {
while (!condition) {
// 忙等待
}
System.out.println("Condition met, exiting waiting thread.");
});
waitingThread.start();
// 模拟一些工作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 改变条件
condition = true;
}
}
在这个例子中,waitingThread
会在条件未满足时不断循环检查condition
的值,直到它变为true
。这种方式会导致CPU资源的浪费。
为了避免忙循环带来的问题,通常可以使用以下几种替代方案:
wait()
和notify()
:通过对象的监视器来实现线程间的通信。Lock
和Condition
:Java的java.util.concurrent.locks
包提供了更灵活的锁机制。CountDownLatch
、CyclicBarrier
等并发工具类:这些类可以帮助管理线程间的协调和同步。总之,虽然忙循环在某些情况下可能是简单有效的,但在大多数情况下,使用更合适的同步机制会更好地利用系统资源。