我正在尝试实现一种逻辑,该逻辑将允许我使用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();
}
}
我的问题是:
最后跟进上述有关“快照”创建的第三点,以下代码是否会以相同的方式工作:
public void doWork() {
actuallyDoWork(this.objects);
}
public void actuallyDoWork() {
for (final Object object : currentObjects) {
object.toString();
}
}