Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin通道在协同程序中是否使用线程安全/同步/保持在关系发生之前?_Kotlin_Kotlinx.coroutines - Fatal编程技术网

Kotlin通道在协同程序中是否使用线程安全/同步/保持在关系发生之前?

Kotlin通道在协同程序中是否使用线程安全/同步/保持在关系发生之前?,kotlin,kotlinx.coroutines,Kotlin,Kotlinx.coroutines,Kotlin通道中的功能是否线程安全?e、 g val channel = Channel<Boolean>() val job1 = GlobalScope.launch { channel.send(true) } val job2 = GlobalScope.launch { val x = channel.poll() } val channel=channel() val job1=GlobalScope.launch{ channel.send(真) }

Kotlin通道中的功能是否线程安全?e、 g

val channel = Channel<Boolean>()
val job1 = GlobalScope.launch {
    channel.send(true)
}
val job2 = GlobalScope.launch {
    val x = channel.poll()
}
val channel=channel()
val job1=GlobalScope.launch{
channel.send(真)
}
val job2=GlobalScope.launch{
val x=channel.poll()
}

如果在上述代码中,在执行
job2
之前机器(实时)在不同线程上执行了
job1
,是否保证
x
设置为
true
?或者它是否可能被设置为
null
(因为cpu缓存未更新)?

通道
类kotlinx.coroutines库是线程安全的。它被设计为支持多线程

GlobalScope.launch
不一定意味着将在新线程中执行协同程序

如果在上述代码中,在执行
job2
之前机器(实时)在不同线程上执行了
job1
,是否保证
x
设置为
true
?或者它是否可能被设置为
null
(因为cpu缓存未更新)

Java内存模型没有时间的概念,它不能仅仅基于一行比另一行执行得更早这一事实来保证任何事情。您甚至无法确定某个操作是何时在CPU上执行的

在您发布的代码中,有两个并发执行的协同路由。当且仅当
channel.poll()
获取非空值时,在边从
send()。如果它得到一个空值,则在edge之前不会发生任何事件

假设您在两个协同程序中确定挂钟时间,如下所示:

var sendTime: Long = 0
var receiveTime: Long = 0

suspend fun main() {
    val channel = Channel<Boolean>(UNLIMITED)
    val job1 = GlobalScope.launch {
        channel.send(true)
        sendTime = System.nanoTime()
    }
    val job2 = GlobalScope.launch {
        receiveTime = System.nanoTime()
        val x = channel.poll()
        println(x)
    }
    job1.join()
    job2.join()
    println("${receiveTime - sendTime}")
}
var sendTime:Long=0
var接收时间:长=0
暂停{
val通道=通道(无限制)
val job1=GlobalScope.launch{
channel.send(真)
sendTime=System.nanoTime()
}
val job2=GlobalScope.launch{
receiveTime=System.nanoTime()
val x=channel.poll()
println(x)
}
job1.join()
job2.join()
println(${receiveTime-sendTime}”)
}
receiveTime
大于
sendTime
这一事实不会导致“发生在之前”关系,也不会强制
channel.poll()
观察发送的项目。调用
nanoTime()
不是同步操作


请注意,这些事实与Kotlin或协同路由无关,具体来说,Java内存模型就是这样工作的。如果你研究C++内存模型,你会发现它是一样的。

我不确定我理解你的答案。我提供的代码示例仅显示了我感兴趣的两个函数。在我的代码中,还有其他逻辑,其中重要的是一个特定的场景。如果代码行
channel.send(true)
是在行
val x=channel.poll()之前执行的,那么我需要获得
x==true
(非空)。如果
poll()
是在
send(true)
之前执行的,那么我不在乎。如果我使用Java的BlockingQueue而不是通道,那么我将获得上述行为(由于同步)。
Channel.poll()
是否与
Channel.send()
同步?如果您对JVM提供的正式保证感兴趣,则
send
poll
之间的时间顺序没有相关性。这也适用于
阻塞队列
。但我想知道你所说的“提前执行”到底是什么意思,你怎么知道什么时候执行了?实际上,我认为它对代码行为的影响最小(只影响循环中的等待时间)。