如果我只是做这样的事情:
synchronized(taskQueue) { //taskQueue is a BlockingQueue
taskQueue.drainTo(tasks); //tasks is a list
}
我可以确保不能在同步块(synchronized block)内执行对
taskQueue.put()
和taskQueue.take()
的并发调用吗?换句话说,我是否使排水到()方法是原子的?
或更一般而言,如何使组成线程安全操作的原子化?
例子:
if(taskQueue.size() == 1) {
/*Do a lot of things here, but I do not want other threads
to change the size of the queue here with take or put*/
}
//taskQueue.size() must still be equal to 1
最佳答案
参见下面摘自Java docs of BlockingQueue的摘录
另外,请查看示例,该示例显示BlockingQueue实现可以安全地与多个生产者和多个消费者一起使用。
因此,如果您不使用addAll, containsAll, retainAll and removeAll
之类的批量Collection操作,那么您是线程安全的。
您甚至不需要synchronized(taskQueue) {
并可以直接使用taskQueue.drainTo(tasks);
,因为BlockingQueue实现对于非批量收集操作(例如put
,take
,drainTo
等)是线程安全的。
希望这可以帮助!