4.1.8ReentrantLock实现生产者消费者模式(多对多)

来源:互联网 发布:龚琳娜 知乎 编辑:程序博客网 时间:2024/05/29 19:23

package demo;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;/** * Created by sunyifeng on 17/10/18. */public class MyService {    private ReentrantLock lock = new ReentrantLock();    private Condition condition = lock.newCondition();    private boolean hasValue = false;    //    public void set(){        try {            lock.lock();            while (hasValue == true) {                System.out.println("AAAAAA");                condition.await();            }            System.out.println("aaaaaa");            hasValue = true;            condition.signalAll(); // FIXME:用signal()出现假死        } catch (InterruptedException e) {            e.printStackTrace();        }finally {            lock.unlock();        }    }    //    public void get(){        try {            lock.lock();            while (hasValue == false) {                System.out.println("BBBBBB");                condition.await();            }            System.out.println("bbbbbb");            hasValue = false;            condition.signalAll(); // FIXME:用signal()出现假死        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            lock.unlock();        }    }}
package demo;/** * Created by sunyifeng on 17/10/18. */public class ThreadA extends Thread {    private MyService myService;    public ThreadA(MyService myService) {        super();        this.myService = myService;    }    @Override    public void run() {        super.run();        for (int i = 0; i < 3; i++) {            myService.set();        }    }}
package demo;/** * Created by sunyifeng on 17/10/18. */public class ThreadB extends Thread {    private MyService myService;    public ThreadB(MyService myService) {        super();        this.myService = myService;    }    @Override    public void run() {        super.run();        for (int i = 0; i < 3; i++) {            myService.get();        }    }}
package demo;/** * Created by sunyifeng on 17/10/18. */public class Run {    public static void main(String[] args) {        MyService myService = new MyService();        ThreadA[] threadA = new ThreadA[10];        ThreadB[] threadB = new ThreadB[10];        for (int i = 0; i < 3; i++) {            threadA[i] = new ThreadA(myService);            threadB[i] = new ThreadB(myService);            threadA[i].start();            threadB[i].start();        }    }}
运行结果:

aaaaaa
AAAAAA
bbbbbb
BBBBBB
aaaaaa
AAAAAA
AAAAAA
bbbbbb
BBBBBB
aaaaaa
AAAAAA
bbbbbb
aaaaaa
AAAAAA
bbbbbb
BBBBBB
aaaaaa
AAAAAA
bbbbbb
BBBBBB
aaaaaa
bbbbbb
BBBBBB
aaaaaa
AAAAAA
bbbbbb
BBBBBB
aaaaaa
AAAAAA
bbbbbb
BBBBBB
aaaaaa
bbbbbb

程序分析:

打印结果是交替出现,但是不是有规律的交替出现,原因是程序中只使用了一个condition对象,唤醒signlAll()方法唤醒的有可能是同类,所以打印的有各种可能。