java - AtomicBoolean 的这种使用是同步块(synchronized block)的有效替代吗?

标签 java locking atomic synchronized atomicboolean

考虑两个不能同时执行的方法a()和b()。 可以使用同步关键字来实现此目的,如下所示。我可以按照下面的代码使用 AtomicBoolean 达到相同的效果吗?

final class SynchonizedAB {

synchronized void a(){
   // code to execute
}

synchronized void b(){
  // code to execute
}

}

尝试使用 AtomicBoolean 实现与上述相同的效果:

final class AtomicAB {

private AtomicBoolean atomicBoolean = new AtomicBoolean();

void a(){
   while(!atomicBoolean.compareAndSet(false,true){

  }
  // code to execute
  atomicBoolean.set(false);
}

void b(){
    while(!atomicBoolean.compareAndSet(false,true){

   }
     // code to execute
     atomicBoolean.set(false);
    }

 }

最佳答案

不,因为 synchronized 会阻塞,而使用 AtomicBoolean 你会忙着等待。

两者都将确保一次只有一个线程执行该 block ,但是您想让 CPU 在 while block 上旋转吗?

关于java - AtomicBoolean 的这种使用是同步块(synchronized block)的有效替代吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25038919/

相关文章:

java - 并发访问unmodifiableMap

java - Junit 参数化测试失败,并出现 java.lang.IllegalArgumentException : argument type mismatch

java - 如何从java中的当前日期减去n天?

java - 如何从 Hibernate Query 中获取 Map 对象

asp.net - HttpApplicationState - 如果线程安全,为什么会存在竞争条件?

c++ - 为什么编译器在循环中从内存中加载这个指针

c++ - 当 std::atomic<T>::is_always_lock_free 为 false 时,std::atomic<T> 对于中断是否安全?

locking - 非抢占式 linux 内核上的 spin_lock

java - 如何锁定两张完整的 Hazelcast map ?

java - 对atomicintegerarray的过时引用可能吗?