1. 程式人生 > 其它 >使用LOCK鎖實現 生產者消費者問題

使用LOCK鎖實現 生產者消費者問題

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