Java高并发编程详解-多线程架构与设计:线程间的通信( 二 )


测试主动interrupt对if中使用wait的影响这里主动interrupt , 可见当producer被interrupt后 , producer就略过了判断 , 继续添加了一个event
Java高并发编程详解-多线程架构与设计:线程间的通信文章插图
wait与sleep的

  • 相同:使线程阻塞可以中断
  • 不同:wait是Object的方法 , sleep是Thread的wait必须要在同步代码块中执行 。 wait会释放monitor的锁 , sleep不会sleep短暂休眠后会退出阻塞?(TODO)wait(没有指定时间的话)必须被中断才会退出阻塞 。
synchronized的缺点
  1. 无法中断synchronized不像sleep和wait那样 , 可以被中断 。
  2. 没有等待时间其他线程获取锁的拥有权必须要等待锁的拥有者(线程)释放后才能执行 。
利用wait、notify实现可中断的BooleanLockp96-104一旦从wait中被唤醒则有机会检查lock是否为false,为false则修改获取锁的线程cureentLockThread为自己 , 并设置lock为true.防止其他线程继续争抢 。 如果wait超时会报错 , notify后超时 也主动抛错 。
关键代码
Java高并发编程详解-多线程架构与设计:线程间的通信文章插图
从wait中被notify或者等待超时后 , 会因为while(locked) , locked为false , 说明没有线程持有monitor的拥有权 , 因此跳出while设置locked=true;this.currentThread=currentThread();
Java高并发编程详解-多线程架构与设计:线程间的通信文章插图
优化 , 超时后清除blackList
Java高并发编程详解-多线程架构与设计:线程间的通信文章插图


推荐阅读