我理解(或者至少我认为我做;))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;
...
}
Run Code Online (Sandbox Code Playgroud)
但是,查看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();
}
Run Code Online (Sandbox Code Playgroud)
如果保证插入的值items[putIndex]在另一个线程中是可见的,只要数组中的元素不是volatile(我知道声明数组本身对元素本身无论如何都没有任何影响)如何保证?另一个线程无法保存数组的缓存副本吗?
谢谢
java中的UUID实现了Comparable.这对我来说似乎有点奇怪,因为在几乎所有情况下,UUID都是随机生成的(或者从某个地方反序列化,但它们最初可能是随机生成的).
比较它们似乎没有任何意义,除非你用顺序递增的LSB/MSB手动生成它们,如果你只想要一个非常大的ID号(两个长号而不是一个普通的长号),这可能是有意义的,但这就是只有我能想到的解释.