课程咨询 :15265420612 QQ:2720475033

  • java等待队列

    发布:潍坊java培训机构      来源:潍坊java培训机构      时间:2016-10-29

  • 潍坊java培训机构小编熟悉wait/notify,它主要是实现线程间协作的,其常用的使用模式如下:

    public synchronized void produce(T t) throws InterruptedException {

    while (isFull()){

    wait();

    }

    produce(t);

    notifyAll();

    }

    public synchronized T consume() throws InterruptedException {

    while (isEmpty()){

    wait();

    }

    T t = consume();

    notifyAll();

    return t;

    }

    潍坊java培训机构

    当条件满足,原来等待的线程就会立即被唤醒,这就要涉及到等待队列,等待队列中的是等待某类条件发生的线程。每一个对象都可以作为锁对象,也同时被当作一个等待队列,并具有wait,notify,notifyall方法。

    判断条件总是涉及到一些状态,如集合是否已满,是否为空等等,这些状态变量必须被锁监控,因为线程在等待或者唤醒另一个线程前,需要访问、操作这些与条件相关的状态变量,而加锁可以保证状态的一致性。另外,正如上例所示,wait方法必须包含在while循环中,原因有二:

    1、从线程被唤醒到重新获得锁的间隙,其他线程获取了锁并且改变了状态,使得条件重新变为false。

    2、如果多种条件与一个等待队列关联,必须使用notifyAll,一个线程可能在条件不满足的情况下被唤醒,这时候需要重新检查条件。

    对象的内置锁只有一个内置等待队列与其关联,这样多个唤醒条件不同的线程就必须在同一个等待队列上,唤醒线程时必须使用notifyAll,导致大部分不符合条件的线程将被唤醒并且参与锁竞争,上下文切换频繁,性能下降,当然,notifyAll是一种比较安全保险的做法。上次我们提过还有另一种实现锁的形式,即Lock,与其对应的是Condition,它可以根据不同的条件提供对应的condition,可将上述使用模式改装一下:

    protected final Lock lock = new ReentrantLock();

    private final Condition notFull = lock.newCondition();

    private final Condition notEmpty = lock.newCondition();

    public void produce(T t) throws InterruptedException {

    lock.lock();

    try {

    while (isFull()) {

    notFull.await();

    }

    produce(t);

    notEmpty.signal();

    } finally {

    lock.unlock();

    }

    }

    public T consume() throws InterruptedException {

    lock.lock();

    try {

    while (isEmpty()) {

    notEmpty.await();

    }

    T t = consume();

    notFull.signal();

    return t;

    } finally {

    lock.unlock();

    }

    }

    通过wait/notify实现线程间协作,是需要一定的技巧的,初级的开发人员不一定能正确使用,我们可以使用一些并发工具类,像LinkedBlockingQueue,ConcurrentHashMap,CountDownLatch实现相应的功能,相关文章以后会陆续推出。

上一篇:git最常用操作及问题解决

下一篇:使用Redis做MyBatis的二级缓存

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:6月30日

Java--大数据周末班

Java--大数据周末班

开班日期:6月30日

Java--大数据全日制班

Java--大数据全日制班

开班日期:6月30日

Java--零基础周末班

Java--零基础周末班

开班日期:6月30日

 扫一扫,关注一下! 潍坊:奎文区东风东街299号建行大厦 济宁:市中区太白路10号苏宁生活广场
烟台:海港路25号阳光100城市广场 临沂:兰山区红旗路1号苏宁易购
淄博:张店区金晶大道68号华润大厦 济南:历下区趵突泉北路三联商社
济南:历下区山大路47号数码港大厦 青岛:市南区金坛路17号
课程培训电话:15265420612 QQ:2720475033 全国服务监督电话:400-111-8989    服务邮箱 tousu@tedu.cn

2001-2017 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56