-condition实现生产者/消费者
class LockService {
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
private boolean hasProduced = false;
void producer() {
lock.lock();
try {
while (hasProduced == true) {
condition.await();
}
System.out.println("生产 ****");
hasProduced = true;
condition.signal();
} catch (Exception e) {
// TODO: handle exception
} finally {
lock.unlock();
}
}
void consumer() {
lock.lock();
try {
while (hasProduced == false) {
condition.await();
}
System.out.println("消费 $$$$");
hasProduced = false;
condition.signal();
} catch (Exception e) {
// TODO: handle exception
} finally {
lock.unlock();
}
}
}
public class Test {
public static void main(String[] args) {
LockService lockService = new LockService();
int i = 10; // 10个生产者,10个消费者
while (i > 0) {
--i;
new Thread(new Runnable() {
@Override
public void run() {
lockService.producer();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
lockService.consumer();
}
}).start();
}
}
}
像上面这样多个生产者/消费者 竞争的时候,就会出现 假死
!!!
假死 就是线程进入waiting等待状态。如果所有线程都进入waiting状态,程序就不再执行任何业务功能了。
解决办法就是: 像前面介绍wait/notify的那样,用 signalAll 唤醒所有等待线程。