zoukankan      html  css  js  c++  java
  • 第一部分:并发理论基础06->用等待通知机制优化循环等待

    1.循环等待

    转出账本和转入账本不满足时,用死循环的方式循环等待

    
    // 一次性申请转出账户和转入账户,直到成功
    while(!actr.apply(this, target))
      ;
    

    耗时非常短,并发冲突量不大时,还可以,耗时长的话,太耗cpu了

    2.最优解决方案

    线程要求的条件(转出账本和转入账本同事在文件上)不满足,就线程阻塞自己,进入等待状态
    线程要求的条件满足后,通知等待的线程重新执行。线程阻塞的方式能避免循环等待消耗cpu的问题

    3.java的等待通知机制

    线程首先获取锁,线程要求的条件不满足,释放互斥锁,进入等待状态
    当要求的条件满足,通知等待的线程,重新获取互斥锁

    4.synchronized 实现等待-通知机制

    synchronized配合wait,notify,notifyAll三个方法轻松实现

    synchronized进入临界区,某些条件不满足,进入等待状态,wait,执行wait方法后,当前线程被阻塞,进入到右边的互斥锁的等待队列,同时释放持有的锁

    image

    和lock的condition里的await方法一样,也会释放锁

    线程要求的条件满足后,使用notify后notifyall方法,通知互斥锁队列中的线程,告诉它条件满足

    image

    线程收到通知后,重新获取锁,因为之前执行await或wait时候,锁已经被释放了

    同时synchronized和wait,notifyall使用上一定注意,要同时使用被锁的对象进行调用
    如果synchronized(this),那么一定是this.wait(),this.notifyall()

    5.等待通知使用

    
    class Allocator {
      private List<Object> als;
      // 一次性申请所有资源
      synchronized void apply(
        Object from, Object to){
        // 经典写法
        while(als.contains(from) ||
             als.contains(to)){
          try{
            wait();
          }catch(Exception e){
          }   
        } 
        als.add(from);
        als.add(to);  
      }
      // 归还资源
      synchronized void free(
        Object from, Object to){
        als.remove(from);
        als.remove(to);
        notifyAll();
      }
    }
    

    6.为什么建议使用notifyall而不是notify

    notify是随意通知互斥锁的等待队列中的一个线程
    notifyall会通知等待队列中的所有线程
    notify的问题是,可能导致某些线程永远不会被通知到

    7.总结

    等待通知,普遍的多线程协作方式
    wait和sleep
    wait会释放锁,而slee不会释放锁
    wait只能再同步方法和同步块中使用,sleep任意地方可以使用
    wait无需捕捉异常,sleep需要
    都会让渡cpu执行时间,等待再次调度。

    原创:做时间的朋友
  • 相关阅读:
    HDOJ 4747 Mex
    HDU 1203 I NEED A OFFER!
    HDU 2616 Kill the monster
    HDU 3496 Watch The Movie
    Codeforces 347A A. Difference Row
    Codeforces 347B B. Fixed Points
    Codeforces 372B B. Hungry Sequence
    HDU 1476 Sudoku Killer
    HDU 1987 How many ways
    HDU 2564 词组缩写
  • 原文地址:https://www.cnblogs.com/PythonOrg/p/14955229.html
Copyright © 2011-2022 走看看