如果我只是做这样的事情:

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实现对于非批量收集操作(例如puttakedrainTo等)是线程安全的。

希望这可以帮助!

09-10 00:06