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在这里的意思是“通过迭代并发地修改集合”。它并不意味着多线程中的并发。