Java:当锁定线程时,AtomicBoolean和静态布尔变量之间有什么不同?

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。在您这样做之后,

我编写了一个名为T的线程类

我的目的是确保一次只运行一个线程对象

因此,当调用线程对象时,它将检查一个名为BUSY的布尔标志

我的问题是,它们之间有什么不同

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?
  }
}