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

标签 java multithreading thread-safety locking atomic

我有一个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/

相关文章:

Java 线程安全延迟初始化

multithreading - 互斥锁如何知道要锁定哪些数据(以及不锁定哪些数据)?

java - Spring Batch - 用于不同分隔文件的 FlatFileItemReader

java - Maven 依赖关系未解决

JAVA如何修复错误>无法在项目sic-desktop上执行目标org.codehaus.mojo :exec-maven-plugin:1. 2.1:exec (default-cli):

php多线程

python - 通过多个 Tor 代理的并发 HTTP 请求

c# - 当调用方法已经拥有同一对象上的锁时,尝试获取该对象上的锁

swift - struct(不变性)与线程安全有何关系

java - 在 Java 中使用泛型时出现空指针异常