Java 原子计算
Java calculation in Atomic
我有一个关于 Java AtomicInteger
的小问题。
我知道我可以实现线程安全的计数器。但是我找不到任何有关 AtomicInteger
.
的复杂计算的信息
例如我有这个计算(i 和 j 是对象变量,"this"):
public void test(int x) {
i = i + ( j * 3 ) + x
}
是否可以仅使用 AtomicInteger
使此方法线程安全?
这有效吗?
public void test(int x) {
do {
int tempi = i.get();
int tempj = j.get();
int calc = tempi + ( tempj * 3 ) + x;
} while (i.compareAndSet(tempi, calc));
}
我认为不是,因为一个线程可以在计算时改变j。
为避免这种情况,我必须控制在计算时是否更改 j。但是我在 AtomicInteger
.
中找不到 "just compare" 函数
伪代码:
public void test(int x) {
do {
int tempi = i.get();
int tempj = j.get();
int calc = tempi + ( tempj * 3 ) + x;
} while (i.compareAndSet(tempi, calc) && j.compare(tempj) /* changed */);
}
谁能帮我澄清一下?
由于您的计算对多个 AtomicXXX
对象(i
、j
)进行操作,因此它们不是线程安全的。 AtomicXXX
语义是通过 Compare-and-Swap (CAS) 指令实现的,这些指令一次不支持多个占位符。您需要一个外部监视器锁以使其成为线程安全的。
我有一个关于 Java AtomicInteger
的小问题。
我知道我可以实现线程安全的计数器。但是我找不到任何有关 AtomicInteger
.
例如我有这个计算(i 和 j 是对象变量,"this"):
public void test(int x) {
i = i + ( j * 3 ) + x
}
是否可以仅使用 AtomicInteger
使此方法线程安全?
这有效吗?
public void test(int x) {
do {
int tempi = i.get();
int tempj = j.get();
int calc = tempi + ( tempj * 3 ) + x;
} while (i.compareAndSet(tempi, calc));
}
我认为不是,因为一个线程可以在计算时改变j。
为避免这种情况,我必须控制在计算时是否更改 j。但是我在 AtomicInteger
.
伪代码:
public void test(int x) {
do {
int tempi = i.get();
int tempj = j.get();
int calc = tempi + ( tempj * 3 ) + x;
} while (i.compareAndSet(tempi, calc) && j.compare(tempj) /* changed */);
}
谁能帮我澄清一下?
由于您的计算对多个 AtomicXXX
对象(i
、j
)进行操作,因此它们不是线程安全的。 AtomicXXX
语义是通过 Compare-and-Swap (CAS) 指令实现的,这些指令一次不支持多个占位符。您需要一个外部监视器锁以使其成为线程安全的。