package com.cc.thread;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 面试题:同时使用两个线程,分别对一个数进行加减
*/
public class PrintIncAndDec {
public static void main(String[] args) throws InterruptedException {
ShareData1 shareData = new ShareData1();
new Thread(()->{//线程A循环10次
for (int i = 0; i < 10; i++) {
shareData.increment();//调用资源类增加方法
}
},"A").start();
TimeUnit.SECONDS.sleep(1);
new Thread(()->{//线程A循环10次
for (int i = 0; i < 10; i++) {
shareData.decrement();//调用资源类减少方法
}
},"B").start();
}
}
//资源类
class ShareData1{
private int data = 0;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void increment(){
lock.lock();
try{
while(data != 0){//如果data不为0,则等待,为0则设置data+1并输出,并通知唤醒其他线程
condition.await();
}
data++;
System.out.println(Thread.currentThread().getName() + "data为" + data);
condition.signalAll();
}
catch (Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
}
}
public void decrement(){
lock.lock();
try{
while(data == 0){//如果data为0,则等待,为1则设置data-1并输出,并通知唤醒其他线程
condition.await();
}
data--;
System.out.println(Thread.currentThread().getName() + "data为" + data);
condition.signalAll();
}
catch (Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
}
}
}