最近我开始阅读Java 7 Concurrency Cookbook'在创建和运行守护程序线程部分中,找到主线程创建的代码和ArrayDeque
的一个实例,并与三个生产者和一个消费者共享其引用。制作人呼叫deque.addFirst(event)
,消费者呼叫deque.getLast()
。
但ArrayDeque
的JavaDoc明确指出:
数组deques不是线程安全的;在没有外部同步的情况下,它们不支持多线程的并发访问。
所以我想知道这是错误还是我不理解?
答案 0 :(得分:0)
数组双端队列不是线程安全的,这意味着您必须提供外部同步。
您正在使用 addFirst(e)是一种插入模型方法,会导致底层数据结构发生变化
您正在使用 getLast(),这是一种检查模型方法,不会导致基础数据结构发生变化。
这就是为什么它起作用的原因,如果您使用的是 removeLast()而不是 getLast(),则应该具有 ConcurrentModification < strong>肯定。
希望这可以清除一切,干杯
答案 1 :(得分:-1)
很明显,如果您不打算提供任何外部同步,那么ArrayDeque不会像Vector那样为您提供同步功能(为线程安全并发提供内部功能)