【问题标题】:volatile array and locality of reference易失性数组和参考位置
【发布时间】:2013-10-30 06:56:07
【问题描述】:

参考位置 .http://en.wikipedia.org/wiki/Locality_of_reference。 所以它就像迭代一个小的int数组会比迭代一个linkedList更快。 因为数组是连续的,并且所有数组都可以放入 cpu 缓存中 会减少缓存未命中。

但我想要一个简单的 int 数组和一个 volatile 数组之间的比较。 AFAIK 迭代易失性数组会导致每次读取易失性,这可能在某些系统中导致 在每次读取时更新缓存。

int[] arr; // assume here i have declared and initialized it.
int sum = 0;
for(int i=0;i<arr.length;i++){
    sum = sum + arr[i];
}

易失性计数器部分

volatile int[] arr; // assume here i have declared and initialized it.
int sum = 0;
for(int i=0;i<arr.length;i++){
    sum = sum + arr[i]; // volatile read everytime
}

那么它们是否相同,或者编译器会将所有易失性读取变成单个易失性读取(编译器优化)

【问题讨论】:

  • 你试过比较生成的字节码吗?在询问(非 JIT)编译器优化时,这通常是一个很好的起点。
  • 我对你想要做什么感到有点困惑。 int arr; 不初始化数组。此外,这个正确的代码:volatile int[] arr = new int[len]; 不会用 volatile 元素初始化数组。只有对数组的可变引用。 jeremymanson.blogspot.com/2009/06/volatile-arrays-in-java.html
  • 嗨,我知道..我说假设他们在那里初始化..不想写代码:)。其次,我知道它是对数组的易失性引用,因此每次执行此操作时它都是易失性的原因 arr[i] .. 因为它首先读取数组和相应的位置

标签: java multithreading concurrency volatile cpu-cache


【解决方案1】:

如果您需要对数组进行易失性访问,您可以使用AtomicIntegerArray。这包装了一个 int 数组,但提供了线程安全语义。

AtomicIntegerArray array = new AtomicIntegerArray(100);
array.addAndGet(1);
array.lazySet(10, 123);
int n = array.get(5); // volatile get
array.set(9, 333); // volatile set.

【讨论】:

    【解决方案2】:

    对 Scientist 的代码稍作改进:您实际上不需要额外的 volatile 布尔标志,只需以下内容即可:

    volatile int[] array = ...;
    
    void write(int index, int value){
        array[index]=value;
        array = array; // explicit volatile write
    }
    
    int read(int index){
        return array[index]; // implicit volatile read
    }
    

    主要的变化是您不需要额外读取 volatile 变量来进行读取,因为访问数组的第 i 个元素涉及读取对数组的 volatile 引用(JIT/编译器是否实际上是不同的东西,但它必须给你同样的保证)。所以这非常好,因为它正是你无论如何都要编写的代码。 遗憾的是,这不适用于对数组的写入,因此您必须进行这种非常丑陋的自分配。

    也就是说 AtomicIntegerArray 类与 this 一样高效(至少您希望如此),并且使整个事情变得明确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 2018-01-18
      相关资源
      最近更新 更多