线程通信生产者和消费者传统版(sync-wait-notityAll)(lock-await-signal)

2021/5/9 10:29:59

本文主要是介绍线程通信生产者和消费者传统版(sync-wait-notityAll)(lock-await-signal),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  1 import java.util.concurrent.locks.Condition;
  2 import java.util.concurrent.locks.Lock;
  3 import java.util.concurrent.locks.ReentrantLock;
  4 
  5 /**
  6  * 模拟增1和减一交替操作,
  7  *
  8  * 1    线程      操作(方法)      资源类
  9  * 2    判断      干活              通知
 10  * 3    防止虚假唤醒机制
 11  */
 12 class ShareData{
 13     private int number=0;
 14     private Lock lock=new ReentrantLock();
 15     private Condition condition=lock.newCondition();
 16     public void increment() throws Exception{
 17         lock.lock();
 18         System.out.println("increment加锁"+lock);
 19         try{
 20             while(number!=0){
 21                 System.out.println("while_in循环"+lock);
 22                 condition.await();
 23             }
 24             number=number+1;
 25             System.out.println(Thread.currentThread().getName()+"\t "+number);
 26             condition.signalAll();
 27         }catch (Exception e){
 28 
 29         }finally {
 30             lock.unlock();
 31             System.out.println("increment解锁"+lock);
 32         }
 33     }
 34     public void decrement() throws  Exception{
 35         lock.lock();
 36         System.out.println("decrement加锁"+lock);
 37         try{
 38             while(number!=1){
 39                 System.out.println("while_de循环"+lock);
 40                 condition.await();
 41             }
 42             number=number-1;
 43             System.out.println(Thread.currentThread().getName()+"\t "+number);
 44             condition.signalAll();
 45         }catch (Exception e){
 46 
 47         }finally {
 48             lock.unlock();
 49             System.out.println("decrement解锁"+lock);
 50         }
 51     }
 52 
 53 }
 54 class ShareData_sync{
 55     private int number=1;
 56     public  synchronized void increment() throws Exception{
 57         try{
 58             while(number!=1){
 59                 this.wait();
 60             }
 61             number=number+1;
 62             System.out.println(Thread.currentThread().getName()+"\t "+number);
 63             this.notifyAll();
 64         }catch (Exception e){
 65 
 66         }
 67     }
 68     public synchronized void decrement() throws  Exception{
 69         try{
 70             while(number!=2){
 71                 this.wait();
 72             }
 73             number=number-1;
 74             System.out.println(Thread.currentThread().getName()+"\t "+number);
 75             this.notifyAll();
 76         }catch (Exception e){
 77 
 78         }
 79     }
 80 
 81 }
 82 
 83 public class ProdConsumer_TraditionDemo {
 84 
 85     public static void main(String[] args) {
 86         ShareData shareData=new ShareData();
 87         new Thread(()->{
 88             for (int i = 0; i <5 ; i++) {
 89                 try {
 90                     shareData.increment();
 91                 } catch (Exception e) {
 92                     e.printStackTrace();
 93                 }
 94             }
 95         },"AA").start();
 96         new Thread(()->{
 97             for (int i = 0; i <5 ; i++) {
 98                 try {
 99                     shareData.decrement();
100                 } catch (Exception e) {
101                     e.printStackTrace();
102                 }
103             }
104 
105         },"BB").start();
106     }
107 }

 



这篇关于线程通信生产者和消费者传统版(sync-wait-notityAll)(lock-await-signal)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程