java-多线程面试题:同时运行两个线程,分别对一个数进行加减

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();
        }
    }
}

 

posted @ 2021-01-23 21:21  榛子岑  阅读(712)  评论(0)    收藏  举报