当前位置: 首页 > 面试题库 >

LinkedBlockingQueue的insert和remove方法线程安全吗?

卫浩瀚
2023-03-14
问题内容

LinkedBlockingQueue在两个不同的线程之间使用。一个线程通过添加数据add,而另一个线程通过添加数据take

我的问题是,我是否需要同步对add和的访问take。是LinkedBlockingQueue的插入和删除方法是线程安全的?


问题答案:

是。从文档:


BlockingQueue实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果。但是,除非在实现中另行指定,否则批量Collection操作addAll,containsAll,retainAll和removeAll不一定是原子执行的。因此,例如,仅在c中添加一些元素之后,addAll(c)可能会失败(引发异常)。”



 类似资料:
  • 我试图理解如果下面是线程安全的,它是由另一个开发人员编写的代码,我已经继承和不再与我们在一起。 我有一个BaseProvider类,它实际上是一个消息缓存,由LinkedBlockingQueue表示。该类将传入的消息存储在队列中。 我有一组读此队列的辅助线程。因此,LinkedBlockingQueue是线程安全的。 正如您所注意到的,每个辅助线程都可以访问所有的提供者,所以当一个辅助线程遍历所

  • IBM的支持指出,Class.GetAnnotation的实现不是线程安全的。 与其他JVM实现(例如,OpenJDK)相比,我们可以看到它们以线程安全的方式实现类方法。IBM JVM是一个闭源JVM,他们确实会发布一些源代码和他们的JVM一起,但无论什么时候他们的类实现是否线程安全,都不足以做出明确的判断。 类文档没有清楚地说明它的方法何时是线程安全的。那么,将类方法(特别是getAnnotat

  • 例如,以下方法: 我关心的是如果我有多个线程调用。对象是否可能被另一个线程覆盖?换句话说,Thread 1调用并获取返回的

  • 看起来它工作得很好,但我想知道我是否必须确保新代码需要线程安全?这里有什么意见吗?抱歉用了假名字,提前致谢。

  • 在并发情景下,如果只用HashMap的get方法(不用put),因为我的Map是放配置数据的,启动完成后里面的数据不会改变,线程是否安全?

  • 引用文档: "BlockingQueue实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现它们的效果。但是,除非在实现中另有说明,否则批量集合操作addAll、perspsAll、retainAll和removeAll不一定以原子方式执行。因此,例如,addAll(c)在只添加c中的一些元素后可能会失败(引发异常)。" 由于在操作的描述中没有写任何特别的东西,我不得不假设