p*******8 发帖数: 344 | 1 网上看到的实现:http://tutorials.jenkov.com/java-concurrency/blocking-queues.html
如果用一个锁,那么同时只能有一个线程调用其中的一个方法,比如说线程1调用put()
, 发现queue满了,就等在那;其他线程肯定不能调用任意一个方法,线程1因为block
也不会去调用take(),那不是永远锁着了? |
g*****g 发帖数: 34805 | 2 You don't need another lock.
()
block
【在 p*******8 的大作中提到】 : 网上看到的实现:http://tutorials.jenkov.com/java-concurrency/blocking-queues.html : 如果用一个锁,那么同时只能有一个线程调用其中的一个方法,比如说线程1调用put() : , 发现queue满了,就等在那;其他线程肯定不能调用任意一个方法,线程1因为block : 也不会去调用take(),那不是永远锁着了?
|
b******n 发帖数: 851 | 3 说过多少遍了, just Google grepcode blocking queque, 就知道Java怎么实现
blockingqueue
()
block
【在 p*******8 的大作中提到】 : 网上看到的实现:http://tutorials.jenkov.com/java-concurrency/blocking-queues.html : 如果用一个锁,那么同时只能有一个线程调用其中的一个方法,比如说线程1调用put() : , 发现queue满了,就等在那;其他线程肯定不能调用任意一个方法,线程1因为block : 也不会去调用take(),那不是永远锁着了?
|
p*******8 发帖数: 344 | 4 好虫大神能展开说说吗?synchronized就算一个lock了吧?
【在 g*****g 的大作中提到】 : You don't need another lock. : : () : block
|
p*******8 发帖数: 344 | 5 看了啊,ArrayBlockingQueue的思路跟上面链接的一样,LinkedBlockingQueue用了两
个单独的takeLock, putLock, 怎样保证thread-safe?
LinkedBlockingQueue: http://www.docjar.com/html/api/java/util/concurrent/LinkedBlockingQueue.java.html
ArrayBlockingQueue:
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/
【在 b******n 的大作中提到】 : 说过多少遍了, just Google grepcode blocking queque, 就知道Java怎么实现 : blockingqueue : : () : block
|
H********n 发帖数: 99 | 6 对于同一个queue对象,同时只能有一个synchronized的method被调用,所以用
synchronized就完全可以做到了。
()
block
【在 p*******8 的大作中提到】 : 网上看到的实现:http://tutorials.jenkov.com/java-concurrency/blocking-queues.html : 如果用一个锁,那么同时只能有一个线程调用其中的一个方法,比如说线程1调用put() : , 发现queue满了,就等在那;其他线程肯定不能调用任意一个方法,线程1因为block : 也不会去调用take(),那不是永远锁着了?
|
p*******8 发帖数: 344 | 7 我明白你的意思,我找到我前面问题的答案了:
1. 调用wait() 会release掉当前的锁, 所以其他线程可以调用take()
2. 关于java linkedBlockingQueue的实现,为什么两个不用的锁也可以, 因为enqueue
/dequeue的操作只分别对head/tail的操作,所以put/take可以同时进行
【在 H********n 的大作中提到】 : 对于同一个queue对象,同时只能有一个synchronized的method被调用,所以用 : synchronized就完全可以做到了。 : : () : block
|
c***1 发帖数: 652 | 8 Thread 1 is in wait() state, it doesn't hold lock of the queue.
()
block
【在 p*******8 的大作中提到】 : 网上看到的实现:http://tutorials.jenkov.com/java-concurrency/blocking-queues.html : 如果用一个锁,那么同时只能有一个线程调用其中的一个方法,比如说线程1调用put() : , 发现queue满了,就等在那;其他线程肯定不能调用任意一个方法,线程1因为block : 也不会去调用take(),那不是永远锁着了?
|