最近,我开始阅读“Java7并发Cookbook”,在创建和运行守护进程线程的一节中,我找到了主线程创建的代码和ArrayDeque的一个实例,并与三个生产者和一个使用者共享了它的引用。生产者调用deque.addFirst(event),消费者调用deque.getLast()。
但JavaDoc of ArrayDeque明确表示:
数组标记不是线程安全的;在没有外部同步的情况下,它们不支持多线程的并发访问。
所以我想知道这是个错误还是我只是不明白什么?
发布于 2019-08-26 16:05:41
阵列设备并不是线程安全的,这意味着您必须提供外部同步。
但是,就像霍格说的,它的工作原理是

您使用的是addFirst(e)是一种插入模型方法,会导致底层数据结构中的更改
您使用的是getLast(),它是一种检查模型方法,不会导致底层数据结构中的更改。
这就是它工作的原因,如果您使用的是removeLast()而不是getLast(),那么您肯定会得到ConcurrentModification 异常。
希望这能澄清一切,干杯
发布于 2019-08-26 15:27:17
我们清楚地提到,如果您不打算提供任何外部同步,那么ArrayDeque就不会像Vector那样提供同步特性(为线程安全-并发提供内部特性)。
https://stackoverflow.com/questions/38124043
复制相似问题