Java:当锁定线程时,AtomicBoolean和静态布尔变量之间有什么不同?
我编写了一个名为T的线程类 我的目的是确保一次只运行一个线程对象 因此,当调用线程对象时,它将检查一个名为BUSY的布尔标志 我的问题是,它们之间有什么不同Java:当锁定线程时,AtomicBoolean和静态布尔变量之间有什么不同?,java,multithreading,synchronization,thread-safety,boolean,Java,Multithreading,Synchronization,Thread Safety,Boolean,我编写了一个名为T的线程类 我的目的是确保一次只运行一个线程对象 因此,当调用线程对象时,它将检查一个名为BUSY的布尔标志 我的问题是,它们之间有什么不同 private static AtomicBoolean BUSY = new AtomicBoolean(false); 及 我认为如果使用“static”,所有对象将只检查一个繁忙的布尔变量,以确保只有一个线程对象正在运行。为了获得一个可比较的解决方案,您必须至少使布尔变量为volatile和原子布尔变量为final。在您这样做之后,
private static AtomicBoolean BUSY = new AtomicBoolean(false);
及
我认为如果使用“static”,所有对象将只检查一个繁忙的布尔变量,以确保只有一个线程对象正在运行。为了获得一个可比较的解决方案,您必须至少使布尔变量
为volatile
和原子布尔变量为final
。在您这样做之后,您的用例将不会有任何不同
如果您使用
AtomicBoolean
的getAndSet
或compareAndSet
方法,这些方法将一个读操作和一个写操作组合成一个原子整体,而这些操作在对volatile
执行时不是原子的,您可以使用boolean
并进行适当的同步(并且使不稳定)可以实现您所需要的。
但是通过使用AtomicBoolean
您可以自动检查当前值,而无需自己编写同步代码正如其他人所说,您必须分别将变量设置为final/volatile
从你描述的情况来看,我担心你会有这样一个地方:
if (!BUSY){
BUSY = true;
}
请注意,在缺少公共同步的情况下,这是不正确的,因为两个线程可能会检查该标志,都将其视为false并开始工作
我建议研究处理并发的现有结构:
特别是对于单个许可证,您可能正在寻找。原子布尔
的一个有用功能是,当且仅当BUSY为false时,允许单个线程继续,但不允许任何其他线程继续
private static AtomicBoolean BUSY = new AtomicBoolean(false);
public void doWork(){
if(BUSY.compareAndSet(false,true)){
//do some work
BUSY.set(false);
}else{
//some other thread won, return now or retry later?
}
}
因此,在这里,在任何给定的时间只有一个线程将doWork
。您无法使用volatile boolean
实现这一点,因为您无法确保thread.currentThread()
设置布尔值
private static AtomicBoolean BUSY = new AtomicBoolean(false);
public void doWork(){
if(BUSY.compareAndSet(false,true)){
//do some work
BUSY.set(false);
}else{
//some other thread won, return now or retry later?
}
}