unsafe.compareAndSwapObject替换在另一个线程中迭代的数组

时间:2019-10-26 13:00:11

标签: java arrays concurrency unsafe sun

我正在尝试实现一种逻辑,该逻辑将允许我​​使用sun的unsafe.compareAndSwapObject实用程序在一个线程中更新数组,同时在另一个线程中安全地迭代该数组。我相信CopyOnWriteArrayList可以执行我要搜索的操作,但是它使用锁定进行更新,因此我正在尝试开发一种没有任何锁定的解决方案。

比较和交换逻辑如下:

public void add(final Object toAdd) {
    Object[] currentObjects;
    Object[] newObjects;
    do {
        currentObjects = this.objects;
        newObjects = ArrayUtil.add(currentObjects, toAdd);
    } while (!UNSAFE.compareAndSwapObject(this, OBJECTS_OFFSET, currentObjects, newObjects));
}

虽然迭代逻辑如下(toString()是一个占位符):

public void doWork() {
    Object[] currentObjects = this.objects;
    for (final Object object : currentObjects) {
        object.toString();
    }
}

我的问题是:

  1. 此代码安全吗?
  2. 这是否为我提供了与CopyOnWriteArrayList相同的快照行为?
  3. 如果是,迭代快照何时形成?
    • 我正在创建局部变量的事实是否可以执行此操作?
    • 如果可以,JVM如何知道不对其进行优化?
    • 我本质上是否在堆栈上创建了一个引用最新数组对象的变量?

最后跟进上述有关“快照”创建的第三点,以下代码是否会以相同的方式工作:

public void doWork() {
    actuallyDoWork(this.objects);
}

public void actuallyDoWork() {
    for (final Object object : currentObjects) {
        object.toString();
    }
}

0 个答案:

没有答案