packagecom.yangyuanyuan.juc1205;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;classAircondition
{private int number = 0;private Lock lock = newReentrantLock();private Condition condition =lock.newCondition();public void increment()throwsException
{
lock.lock();try{//1 判断
while (number != 0)
{
condition.await();//this.wait();
}//2 干活
number++;
System.out.println(Thread.currentThread().getName()+"\t"+number);//3 通知
condition.signalAll();//this.notifyAll();
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}public void decrement()throwsException
{
lock.lock();try{//1 判断
while (number == 0)
{
condition.await();//this.wait();
}//2 干活
number--;
System.out.println(Thread.currentThread().getName()+"\t"+number);//3 通知
condition.signalAll();//this.notifyAll();
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}/*public synchronized void increment()throws Exception
{
//1 判断
while (number != 0)
{
//AAA CCC
this.wait();
}
//2 干活
number++;
System.out.println(Thread.currentThread().getName()+"\t"+number);
//3 通知
this.notifyAll();
}
public synchronized void decrement()throws Exception
{
//1 判断
while(number == 0)
{
this.wait();
}
//2 干活
number--;
System.out.println(Thread.currentThread().getName()+"\t"+number);
//3 通知
this.notifyAll();
}*/}/**1 高聚低合前提下,线程操作资源类
2 判断/干活/通知
3 防止虚假唤醒 不能使用if判断,会出现2
知识小总结 = 多线程编程套路+while判断+新版写法*/
public classProdConsumerDemo04
{public static void main(String[] args)throwsException
{
Aircondition aircondition= newAircondition();new Thread(() ->{for (int i = 1; i <=10; i++)
{try{
Thread.sleep(200);
aircondition.increment();
}catch(Exception e) {
e.printStackTrace();
}
}
},"A").start();new Thread(() ->{for (int i = 1; i <=10; i++)
{try{
Thread.sleep(300);
aircondition.decrement();
}catch(Exception e) {
e.printStackTrace();
}
}
},"B").start();new Thread(() ->{for (int i = 1; i <=10; i++)
{try{
Thread.sleep(400);
aircondition.increment();
}catch(Exception e) {
e.printStackTrace();
}
}
},"C").start();new Thread(() ->{for (int i = 1; i <=10; i++)
{try{
Thread.sleep(500);
aircondition.decrement();
}catch(Exception e) {
e.printStackTrace();
}
}
},"D").start();
}
}