使用LOCK鎖實現 生產者消費者問題
阿新 • • 發佈:2021-09-08
使用LOCK鎖實現 生產者消費者問題
在之前入門學習中的生產者消費者問題裡 是使用的synchronized wait() notifyAll()實現
https://www.cnblogs.com/OfflineBoy/p/14613402.html
現在嘗試使用lock鎖實現 同時做到解耦
lock對應的兩個函式在condition類裡面
程式碼例子
package com.jie.demo2; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class PCdemo { public static void main(String[] args) { Data data=new Data(); new Thread(()->{ for(int i=0;i<10;i++){ try{ data.increment(); } catch (InterruptedException e) { e.printStackTrace(); } } },"A").start(); new Thread(()->{ for(int i=0;i<10;i++){ try{ data.decrement(); } catch (InterruptedException e) { e.printStackTrace(); } } },"B").start(); new Thread(()->{ for(int i=0;i<10;i++){ try{ data.increment(); } catch (InterruptedException e) { e.printStackTrace(); } } },"C").start(); new Thread(()->{ for(int i=0;i<10;i++){ try{ data.decrement(); } catch (InterruptedException e) { e.printStackTrace(); } } },"D").start(); } } class Data{ private int number=0; Lock lock=new ReentrantLock(); Condition condition = lock.newCondition(); public void increment() throws InterruptedException { try{ lock.lock(); while(number!=0){ condition.await(); } number++; System.out.println(Thread.currentThread().getName()+"=>"+number); condition.signalAll(); } catch (Exception e){ } finally { lock.unlock(); } } public void decrement() throws InterruptedException { try{ lock.lock(); while(number==0){ condition.await(); } number--; System.out.println(Thread.currentThread().getName()+"=>"+number); condition.signalAll(); } catch (Exception e){ e.printStackTrace(); } finally { lock.unlock(); } } }