gpt4 book ai didi

java - java中读/写变量的原子操作

转载 作者:行者123 更新时间:2023-12-01 16:53:58 24 4
gpt4 key购买 nike

我有一个java类如下:

public class Example implements Runnable {

private int num;

...

// Getter
public int getNum(){
return this.num;
}

// Setter
public void addToNum(int amount) {

if (this.amount> 0) {
this.num += amount;
}
}

...
}

该类可以由多个线程实例化。每个实例都有自己的“num”,也就是说,我不希望在所有实例之间共享“num”变量。

对于每个实例,可以同时访问多个线程以读取/写入“num”变量。那么保护“num”变量上的读/写操作以使它们成为原子操作的最佳选择是什么?

我知道在 C# 上可以使用 lock(object) 来完成,如下面的链接,但在 java 中我不知道(我是新手):

Atomic operations on C#

最佳答案

您可以同步这些方法,但您可能会发现使用 AtomicInteger 是更快的选择。

private final AtomicInteger num = new AtomicInteger();

...

// Getter
public int getNum(){
return this.num.get();
}

// Setter
public void addToNum(int amount) {
if (amount > 0) {
this.num.getAndAdd(amount);
}
}

这两种方法都是无锁的,并且避免暴露可能被意外使用的锁。

在 Java 8 中,getAndAdd 使用单个机器代码指令通过 Unsafe 类进行添加。来自AtomicInteger

private volatile int value;

public final int get() {
return value;
}
public final int getAndAdd(int delta) {
return unsafe.getAndAddInt(this, valueOffset, delta);
}

关于java - java中读/写变量的原子操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35314813/

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