小编par*_*oid的帖子

Volatile和ArrayBlockingQueue以及其他并发对象

我理解(或者至少我认为我做;))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 multithreading volatile java.util.concurrent

3
推荐指数
1
解决办法
181
查看次数

为什么java.util.UUID是Comparable?

java中的UUID实现了Comparable.这对我来说似乎有点奇怪,因为在几乎所有情况下,UUID都是随机生成的(或者从某个地方反序列化,但它们最初可能是随机生成的).

比较它们似乎没有任何意义,除非你用顺序递增的LSB/MSB手动生成它们,如果你只想要一个非常大的ID号(两个长号而不是一个普通的长号),这可能是有意义的,但这就是只有我能想到的解释.

java uuid comparable

2
推荐指数
3
解决办法
610
查看次数