如何在多个线程之间安全地共享ArrayDeque?

时间:2016-06-30 13:06:01

标签: java multithreading

最近我开始阅读Java 7 Concurrency Cookbook'在创建和运行守护程序线程部分中,找到主线程创建的代码和ArrayDeque的一个实例,并与三个生产者和一个消费者共享其引用。制作人呼叫deque.addFirst(event),消费者呼叫deque.getLast()

ArrayDeque的JavaDoc明确指出:

  

数组deques不是线程安全的;在没有外部同步的情况下,它们不支持多线程的并发访问。

所以我想知道这是错误还是我不理解?

2 个答案:

答案 0 :(得分:0)

数组双端队列不是线程安全的,这意味着您必须提供外部同步。

但是为什么会起作用,就像霍尔格所说的那样 Deque methods

您正在使用 addFirst(e)是一种插入模型方法,会导致底层数据结构发生变化

您正在使用 getLast(),这是一种检查模型方法,不会导致基础数据结构发生变化。

这就是为什么它起作用的原因,如果您使用的是 removeLast()而不是 getLast(),则应该具有 ConcurrentModification < strong>肯定。

希望这可以清除一切,干杯

答案 1 :(得分:-1)

很明显,如果您不打算提供任何外部同步,那么ArrayDeque不会像Vector那样为您提供同步功能(为线程安全并发提供内部功能)