Kotlin局部变量线程安全

因此,我正在编写用于测试某些多线程的单元测试,并且我想知道该代码是否可以保证按预期工作。

fun testNumbers() {
    var firstNumber: Int? = null
    var secondNumber: Int? = null
    val startLatch = CountDownLatch(2)
    val exec = Executors.newFixedThreadPool(2)

    exec.submit({
        startLatch.countDown()
        startLatch.await()
        firstNumber = StuffDoer.makeNumber()
    })
    exec.submit({
        startLatch.countDown()
        startLatch.await()
        secondNumber = StuffDoer().makeNumber()
    })
    while (firstNumber == null || secondNumber == null) {
        Thread.sleep(1)
    }
}

具体来说,此方法是否可以保证完成?firstNumbersecondNumber不是volatile这是否意味着从这些值设定的结果exec线程可能永远不会通过运行测试的线程可以看到?您不能将volatile应用于局部变量,因此实际上来说,如果有必要,就不能使函数局部变量变为volatile对我来说没有意义。

(我添加了Java作为标记,因为大概的基本问题在Java中是相同的。)

热键

使用Kotlin 1.1 RC编译器进行编译时,代码中的局部变量存储在ObjectRefs中,然后在lambda中使用。

您可以使用Kotlin字节码查看器检查要编译的代码段

ObjectRef将引用存储在非易失性字段中,因此实际上不能保证程序会完成。

早期版本的Kotlin曾经volatileRef类中包含一个字段,但这是一个未记录的实现细节(即不是要依赖的东西),最终在Kotlin 1.1中进行了更改有关非易失性捕获变量的动机,请参见此线程


问题描述中所述

如果用户正在捕获变量并将其交给其他线程使用,则需要使用任何并发控制机制来建立相应的事件,即在读取和写入捕获的变量之间的边沿之前。所有常规的并发机制,例如启动/加入线程,创建期货等。

为了使示例程序正确同步,只需调用从返回.get()的两个Future实例就足够了exec.submit { },因为Future提供了事前保证:

异步计算所采取的动作,由另一个线程中Future检索结果之后的“先发生”动作表示Future.get()

val f1 = exec.submit { /* ... */ }
val f2 = exec.submit { /* ... */ }

f1.get()
f2.get()

// Both assignments made in the submitted tasks are visible now
assert(firstNumber != null) 
assert(secondNumber != null) 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

是局部变量方法的线程共享?

来自分类Linux

线程局部变量和fs段

来自分类Java

为什么局部变量在Java中是线程安全的

来自分类Java

静态方法和线程安全中的局部变量

来自分类Java

Java中是否有线程组局部变量?

来自分类Java

什么是线程中的局部变量?

来自分类Java

Java实例变量在局部变量内引用。内存,线程安全性和完成

来自分类Dev

静态局部变量的线程安全增量

来自分类Dev

使用线程安全针对局部变量和全局变量进行Java垃圾收集

来自分类Dev

线程安全局部变量

来自分类Dev

C#并行循环局部变量线程安全信息

来自分类Dev

线程共享局部变量吗?

来自分类Dev

Kotlin when()局部变量介绍

来自分类Dev

C ++ 11-当我将局部变量作为参数传递给线程时,它是否安全?

来自分类Dev

多线程共享局部变量

来自分类Dev

在OpenMP中重置线程局部变量

来自分类Dev

线程局部变量的初始化

来自分类Dev

C ++:是否使用IIFE线程安全初始化静态局部变量?

来自分类Dev

如何在Rust结构内部创建线程局部变量?

来自分类Dev

具有局部变量的全局方法线程安全

来自分类Dev

局部变量是线程安全的吗?

来自分类Dev

局部变量的安全性

来自分类Dev

仅具有局部变量的实例方法的线程安全

来自分类Dev

在匿名线程的上下文中访问局部变量是否安全?

来自分类Dev

通过引用将局部变量传递给C ++线程

来自分类Dev

Java局部变量线程安全

来自分类Dev

Kotlin - 局部变量与全局变量

来自分类Dev

修改 Kotlin Lambdas 内部的局部变量

来自分类Dev

Ruby 中的线程局部实例局部变量