【发布时间】:2017-03-28 12:41:42
【问题描述】:
我理解(或者至少我认为我理解;))volatile 关键字背后的原理。
查看ConcurrentHashMap 源代码时,您可以看到所有节点和值都声明为volatile,这是有道理的,因为可以从多个线程中写入/读取值:
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
volatile V val;
volatile Node<K,V> next;
...
}
但是,查看ArrayBlockingQueue 源代码,它是一个从多个线程更新/读取的普通数组:
private void enqueue(E x) {
// assert lock.getHoldCount() == 1;
// assert items[putIndex] == null;
final Object[] items = this.items;
items[putIndex] = x;
if (++putIndex == items.length)
putIndex = 0;
count++;
notEmpty.signal();
}
如何保证插入到items[putIndex] 中的值将从另一个线程可见,前提是数组内的元素不是易失性的(我知道声明数组本身对元素本身没有任何影响) ?
其他线程不能保存数组的缓存副本吗?
谢谢
【问题讨论】:
标签: java multithreading volatile java.util.concurrent