Java ”;挥发性“;在”;HashMap“;关于”;modCount“;

Java ”;挥发性“;在”;HashMap“;关于”;modCount“;,java,hashmap,Java,Hashmap,为什么HashMap不使用volatile修改modCount以确保当另一个线程更改Map时,一个线程可以立即知道它的更改 下面的片段: /** * The number of times this HashMap has been structurally modified * Structural modifications are those that change the number of mappings in * the HashMap or otherwise modif

为什么
HashMap
不使用
volatile
修改
modCount
以确保当另一个线程更改
Map
时,一个线程可以立即知道它的更改

下面的片段:

/**
 * The number of times this HashMap has been structurally modified
 * Structural modifications are those that change the number of mappings 
in
 * the HashMap or otherwise modify its internal structure (e.g.,
 * rehash).  This field is used to make iterators on Collection-views of
 * the HashMap fail-fast.  (See ConcurrentModificationException).
 */
transient int modCount;

modCount
声明为
volatile
的唯一好处是使并发修改的“快速失败”检测更快。。。在某些情况下:

  • 对于线程受限的
    HashMap
    (即仅由一个线程使用),没有任何功能优势。线程保证看到它对
    modCount
    所做的更新

  • 对于非线程限制但以其他方式(正确)同步的
    HashMap
    ,同步应确保
    modCount
    在从更新它的线程以外的另一个线程查看时不会过时。同样,没有功能性好处

  • 对于一个不受线程限制且未正确同步的
    HashMap
    ,您的做法是错误的,您需要担心的问题比并发修改的“快速失败”检测要大得多。所以好处是。。。。边缘的

与上述相反的是,声明
modCount
volatile
将导致所有读取或写入该字段的
HashMap
操作的性能损失(以内存障碍和额外内存读取和写入的形式)。(这就是他们中的大多数。)

总之:在某些用例中,零或最小的收益与性能开销相比可能是显著的



1-例如,
HashMap
损坏。

modCount
声明为
volatile
的唯一好处是使并发修改的“快速失败”检测更快。。。在某些情况下:

  • 对于线程受限的
    HashMap
    (即仅由一个线程使用),没有任何功能优势。线程保证看到它对
    modCount
    所做的更新

  • 对于非线程限制但以其他方式(正确)同步的
    HashMap
    ,同步应确保
    modCount
    在从更新它的线程以外的另一个线程查看时不会过时。同样,没有功能性好处

  • 对于一个不受线程限制且未正确同步的
    HashMap
    ,您的做法是错误的,您需要担心的问题比并发修改的“快速失败”检测要大得多。所以好处是。。。。边缘的

与上述相反的是,声明
modCount
volatile
将导致所有读取或写入该字段的
HashMap
操作的性能损失(以内存障碍和额外内存读取和写入的形式)。(这就是他们中的大多数。)

总之:在某些用例中,零或最小的收益与性能开销相比可能是显著的



1-例如,
HashMap
corruptions.

,因为HashMap是专门为线程安全而设计的。如果需要,可以使用哈希表或Collections.synchronizedMap使其成为线程安全的。但是如果你不需要线程安全,那么它的开销是毫无意义的。不要被“ConcurrentModificationException”中的“Concurrent”所愚弄——Concurrent在这里的意思是“通过迭代并发地修改集合”。它并不意味着多线程中的并发。因为HashMap是专门为线程安全而设计的。如果需要,可以使用哈希表或Collections.synchronizedMap使其成为线程安全的。但是如果你不需要线程安全,那么它的开销是毫无意义的。不要被“ConcurrentModificationException”中的“Concurrent”所愚弄——Concurrent在这里的意思是“通过迭代并发地修改集合”。它并不意味着多线程中的并发。