Java中类库有很多阻塞实现,例如LinkedBlockingQueue
,CountDownLatch
等,那么这些工具类怎么实现的线程阻塞/唤醒的呢?
常见实现线程阻塞的方式有两种
-
wait/notify
机制 -
LockSupport
的park
、unpark
机制
通过追踪源码可以看到LinkedBlockingQueue
和CountDownLatch
都是使用 LockSupport
的park
、unpark
机制,传统的wait/notify
机制在jdk源码中使用的较少,基本都是基于AQS中的LockSupport
实现阻塞/唤醒机制,也有ReentrantLock
与Condition
结合实现的加锁阻塞/唤醒机制,例如'ArrayBlockingQueue',但ReentrantLock
与Condition
机制底层也是使用LockSupport
实现的。
网友评论