阻塞队列排水管To()方法的线程安全
BlockingQueue的文档说批量操作不是线程安全的,尽管它没有明确提到referTo()方法。
阻塞队列实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果。但是,除非在实现中另有指定,否则大容量收集操作 addAll、containAll、retainAll 和 removeAll 不一定是以原子方式执行的。因此,例如,addAll(c) 在 c 中仅添加一些元素后可能会失败(引发异常)。
drainTo() 方法的文档指定不能以线程安全的方式修改 BlockingQueue 的元素所消耗到的集合。但是,它没有提到任何关于 drainTo() 操作是线程安全的。
从此队列中删除所有可用元素,并将它们添加到给定的集合中。此操作可能比重复轮询此队列更有效。尝试将元素添加到集合 c 时遇到的失败可能会导致在引发关联的异常时,元素不在集合中,或者两者都在集合中。尝试将队列排出到自身会导致非法参数异常。此外,如果在操作过程中修改了指定的集合,则此操作的行为未定义。
那么,drainTo() 方法线程安全吗?换句话说,如果一个线程在阻塞队列上调用了 drainTo() 方法,而另一个线程在同一队列上调用 add() 或 put(),那么在两个操作结束时,队列的状态是否一致?