【发布时间】:2015-04-09 15:12:05
【问题描述】:
常见的实现是here,Java的内置实现是here。关于这两种实现,我有两个问题:
1) 第一个实现在 put() 和 take() 方法上使用synchronized 关键字,这意味着只有一个线程可以访问一个方法。假设线程A调用put()发现队列已满,等待,那么由于锁还没有释放,没有人可以调用take()方法,怎么实现呢?
2) Java 的内置使用了两个锁:takeLock 和 putLock,分别用于 put() 和 take()。我看到区间队列是一个链表,不是线程安全的,怎么办?
【问题讨论】:
-
for 1:等待释放锁,所以不会阻塞其他线程占用。
-
您在#1 中的假设是错误的:调用
wait()实际上释放了该线程的锁。然后另一个线程可以在take()方法中捕获锁,当notifyAll()被另一个线程调用时,卡在put()中的线程将被唤醒。 -
@NathanHughes 感谢您的澄清
-
@PlatinumAzure 谢谢,第二个有什么想法吗?
标签: java multithreading blockingqueue