有没有办法在 java 中实现线程安全/原子的 if-else 条件?
Is there a way to implement an if-else condition that is threadsafe/ atomic in java?
举个例子:
public class XYZ{
private AtomicInteger var1;
private int const_val;
// these all attributes are initialized with a constructor, when an instance of the class is called.
// my focus is on this method, to make this thread-safe
public boolean isPossible(){
if(var1 < const_val){
var1.incrementAndGet();
return true;
}
else{
return false;
}
}
}
如果我不能使用锁定机制(在 java 中),如何制作这个(整个“if-else”片段)thread-safe/atomic?
我阅读了有关 AtomicIntegers 的内容,并阅读了有关 AtomicBooleans 的内容,我可以使用它们使此代码段线程安全吗?
您可以无条件递增,并在读取时强制执行最大值,而不是在写入时强制执行最大值,如下所示:
public boolean increment(){
return var1.getAndIncrement() < const_val;
}
public int getVar1() {
return Math.min(const_val, var1.get());
}
假设您对这个变量所做的一切就是增加它。该解决方案的一个问题是它最终可能导致溢出。如果这可能是一个问题,您可以切换到 AtomicLong。
像这样应该可以解决问题。
public boolean isPossible(){
for(;;){
int current = var1.get();
if(current>=max){
return false;
}
if(var1.compareAndSet(current, current+1)){
return true;
}
}
}
举个例子:
public class XYZ{
private AtomicInteger var1;
private int const_val;
// these all attributes are initialized with a constructor, when an instance of the class is called.
// my focus is on this method, to make this thread-safe
public boolean isPossible(){
if(var1 < const_val){
var1.incrementAndGet();
return true;
}
else{
return false;
}
}
}
如果我不能使用锁定机制(在 java 中),如何制作这个(整个“if-else”片段)thread-safe/atomic?
我阅读了有关 AtomicIntegers 的内容,并阅读了有关 AtomicBooleans 的内容,我可以使用它们使此代码段线程安全吗?
您可以无条件递增,并在读取时强制执行最大值,而不是在写入时强制执行最大值,如下所示:
public boolean increment(){
return var1.getAndIncrement() < const_val;
}
public int getVar1() {
return Math.min(const_val, var1.get());
}
假设您对这个变量所做的一切就是增加它。该解决方案的一个问题是它最终可能导致溢出。如果这可能是一个问题,您可以切换到 AtomicLong。
像这样应该可以解决问题。
public boolean isPossible(){
for(;;){
int current = var1.get();
if(current>=max){
return false;
}
if(var1.compareAndSet(current, current+1)){
return true;
}
}
}