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)
我可以以原子方式做到这一点吗?这也是个好主意吗?
不太清楚你要问什么。但是假设您想确保某些代码仅在第一次执行(或不执行)并且该函数可能会同时调用(因为您要求“原子”),那么答案是:不,不。您的两个代码示例都不是线程安全的,并且可能会导致以特殊方式处理的不仅仅是第一个调用。
这并不是因为布尔值不是原子的,而是因为您的代码不是原子的。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)
归档时间: |
|
查看次数: |
4750 次 |
最近记录: |