唤醒同一把锁上所有线程,意味着唤醒己方线程,跟对方线程抢夺cpu资源,己方线程就算抢到了锁,也通过不了flag标识,这是浪费时间。
Jdk1.5中提供了多线程升级解决方案;
将同步synchronize替换成现实Lock操作;
将Object中的wait、notify、notifyAll,替换成condition对象;
该对象可以通过Lock锁,进行获取;
形象来说,condition对象可以用来给同一把锁上的所有线程进行分类;
在该示例中,实现了本方只唤醒对方的操作
相关代码
package com.javaxl.thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @author 小李飞刀 * @site www.javaxl.com * @company * @create 2019-05-29 21:34 * <p> * 针对于多生产者消费者操作资源的代码(jdk1.5针对于线程这一块做的改进) */ public class Demo5 { public static void main(String[] args) { // 一个资源池 Res r = new Res(); Thread in = new Thread(new Input(r)); Thread out = new Thread(new Output(r)); in.start(); out.start(); Thread in2 = new Thread(new Input(r)); Thread out2 = new Thread(new Output(r)); in2.start(); out2.start(); } } class Res { private boolean flag = false; private int num = 0; private Lock lock = new ReentrantLock(); private Condition in_condition = lock.newCondition(); private Condition out_condition = lock.newCondition(); /** * 往资源池中添加资源 */ //生产者 t1 t2 public void set() { lock.lock(); try { while (this.flag) { in_condition.await(); } System.out.println(Thread.currentThread().getName() + "----------生产者---" + (++num)); this.flag = true; out_condition.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } //消费者 t3 t4 public void out() { lock.lock(); try { while (!this.flag) { out_condition.await(); } System.out.println(Thread.currentThread().getName() + "-消费者---" + num); this.flag = false; in_condition.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } /** * 往资源池中生产 */ class Input implements Runnable { private Res r; public Input(Res r) { this.r = r; } @Override public void run() { while (true) { r.set(); } } } /** * 从资源池消费 */ class Output implements Runnable { private Res r; public Output(Res r) { this.r = r; } @Override public void run() { while (true) { r.out(); } } }
最终版结果
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有