我有一个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 中我不知道(我是新手):
最佳答案
您可以同步这些方法,但您可能会发现使用 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/