在 kotlin 中使用原子布尔值是个好主意吗?

Viv*_*odi 3 concurrency atomic-values compare-and-swap kotlin

嘿,我正在科特林学习原子。我想知道在我的场景中使用原子布尔值是个好主意吗?有人可以建议如何以原子方式进行。

场景 1非首次通话

var isFirstTime = true

fun notForFirstTime(){
   if(!isFirstTime){
     jobDone()
   }
  isFirstTime = false
}
Run Code Online (Sandbox Code Playgroud)

场景2仅限第一次

var isFirstTime = true

fun onlyForFirstTime(){
   if(isFirstTime){
     jobDone()
   }
  isFirstTime = false
}
Run Code Online (Sandbox Code Playgroud)

我可以以原子方式做到这一点吗?这也是个好主意吗?

bro*_*oot 5

不太清楚你要问什么。但是假设您想确保某些代码仅在第一次执行(或不执行)并且该函数可能会同时调用(因为您要求“原子”),那么答案是:不,不。您的两个代码示例都不是线程安全的,并且可能会导致以特殊方式处理的不仅仅是第一个调用。

这并不是因为布尔值不是原子的,而是因为您的代码不是原子的。isFirstTime两个或多个并发线程可以同时检查,然后其他线程将其翻转为false

您可以通过多种方式解决此问题,例如使用互斥体,但最简单且性能最高的可能是使用比较和交换操作之一。例如:

val isFirstTime = AtomicBoolean(true)

fun notForFirstTime(){
  if (!isFirstTime.getAndSet(false)) {
    jobDone()
  }
}

fun onlyForFirstTime(){
  if (isFirstTime.getAndSet(false)) {
    jobDone()
  }
}
Run Code Online (Sandbox Code Playgroud)