一、使用Lock來模擬生產消費
關鍵方法:lock()、await()、signalAll()、unlock()
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/*
題目:一個初始值爲0的變量,兩個線程對其交替操作,一個加一一個減一,來5輪
*/
public class ProdConsumer_LockDemo {
public static void main(String[] args) {
ShareData shareData = new ShareData();
new Thread(() -> {
for (int i = 0; i < 5; i++) {
shareData.increment();
}
},"生產線程").start();
new Thread(() -> {
for (int i = 0; i < 5; i++) {
shareData.decrement();
}
}, "消費線程").start();
}
}
class ShareData{
private int number=0;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void increment(){
lock.lock();
try{
//使用while防止虛假喚醒
while (number != 0) {
//等待,不能生產
condition.await();
}
number ++;
System.out.println(Thread.currentThread().getName()+"\t"+number);
condition.signalAll();
}catch (Exception e) {
}finally {
lock.unlock();
}
}
public void decrement(){
lock.lock();
try{
//使用while防止虛假喚醒
while (number == 0) {
//等待,不能生產
condition.await();
}
number --;
System.out.println(Thread.currentThread().getName()+"\t"+number);
condition.signalAll();
}catch (Exception e) {
}finally {
lock.unlock();
}
}
}