- 
                Notifications
    
You must be signed in to change notification settings  - Fork 0
 
Open
Description
package com.ph.juc;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class ShareData{
private int number = 0;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void increment() throws Exception{
    lock.lock();
    try{
        // 1. 判断
        while (number != 0){
            // 等待不能生产
            condition.await();
        }
        // 2. 干活
        number++;
        System.out.println(Thread.currentThread().getName() + "\t " + number);
        // 3.通知、唤醒
        condition.signalAll();
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        lock.unlock();
    }
}
public void decrement() throws Exception{
    lock.lock();
    try{
        // 1. 判断
        while (number == 0){
            // 等待不能生产
            condition.await();
        }
        // 2. 干活
        number--;
        System.out.println(Thread.currentThread().getName() + "\t " + number);
        // 3.通知、唤醒
        condition.signalAll();
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        lock.unlock();
    }
}
}
/**
- @author panghui
 - @Version 1.0
 - @SInCE 2019-09-03
 - 一个初始值为零的变量,两个线程对其进行交替操作,一个加1一个减1,来5轮
 - 
- 线程-操作-资源类
 
 - 
- 判断-干活-通知
 
 - 
- 防止虚假唤醒机制
 
 
*/
public class ProdConsumer_TraditionDemo {
public static void main(String[] args) throws Exception{
    ShareData shareData = new ShareData();
    new Thread(()->{
        for (int i = 1; i <= 5; i++) {
            try {
                shareData.increment();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    },"AA").start();
    new Thread(()->{
        for (int i = 1; i <= 5; i++) {
            try {
                shareData.decrement();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    },"BB").start();
}
}
Metadata
Metadata
Assignees
Labels
No labels