AQS源码-condition

126 阅读1分钟

在学习线程池中,有一个重要的参数,BlockingQueue就是任务缓冲队列的实现(boundTask)。缓冲队列要实现的功能,出队和入队,当队列为空是出队的操作就会阻塞,等待放入新的数据。出队线程如何感知新数据的填入?按照我的理解有两种方式:

  • 当前线程自旋获取数据
  • 阻塞出队线程等待唤醒

第二种方法,就必须实现出队线程和入队线程之间的通信。在object对象中提供了wait()和notify()方法,这两个方法只能在同步代码块中使用。当出队线程阻塞是,调用notify(),并不能精确的出队线程(出队和入队共用一把锁,也正式因为共用一把锁,才能实现线程的通信)。想要区分,就要使用AQS的condition实现等待。

知道condition和wait()/notify()的区别和应用场景即可