gpt4 book ai didi

java - 交换 2 个不同 AtomicReferences 中的 2 个值

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:01:42 24 4
gpt4 key购买 nike

我尝试为 2 个 AtomicReferences 实现交换方法。

public void swap(AtomicReference<Object> a, AtomicReference<Object> b) {
while (true) {
Object value1 = a.get();
Object value2 = b.get();

if (a.compareAndSet(value1, value2) && b.compareAndSet(value2, value1)) return;
}
}

在我看来,这个解决方案是不正确的。如果多个线程同时使用该方法,可能会导致如下场景:

T1: ...get(); get(); compareAndSet() == true //-> BREAK (scheduler)
T2: ...get(); get(); compareAndSet() == true; compareAndSet() == true; return;

这意味着,T1 已经设置了 a 的值,但是设置 b 的值将会失败。即使已设置 AtomicReference a,T1 也会重复该过程。

你们有没有更好的主意,如何实现这样的东西?如果您只有一个 AtomicReference,那将很容易。也许使用 2 个 AtomicReference 是不可能的,我应该考虑使用一个指向 Object[] 的 AtomicReference。

在 Scala 中,这个方法非常容易实现,因为你有原子 block 。

class Swappy[A](_a: A, _b: A) {

@volatile
var a = Ref(_a)
@volatile
var b = Ref(_b)

def swap(): Unit = {
atomic {
implicit tx =>
val tmp = a
a = b
b = tmp
}
}

def elems: (A, A) = (a.single(), b.single())
}

最佳答案

我用不同的方法创建了一个解决方案。这应该是 100% 线程安全的。我转而只使用一个 AtomicReference。如果有人能找到更好的方法,请随时写下答案。 :)

package test;

import java.util.concurrent.atomic.*;

public class ScalaSTMPendant {

AtomicReference<Object[]> a;

public ScalaSTMPendant(Object a, Object b) {
this.a = new AtomicReference<>(new Object[] {a,b});
}

public void swap() {
while (true) {
Object[] origin = a.get();

Object[] swapped = new Object[] {origin[1], origin[0]};

if (a.compareAndSet(origin, swapped)) return;
}
}

public Object[] elems() {
Object[] temp = a.get();
return new Object[] {temp[0], temp[1]};
}
}

关于java - 交换 2 个不同 AtomicReferences 中的 2 个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28262263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com