Kotlin通道在协同程序中是否使用线程安全/同步/保持在关系发生之前?
Kotlin通道中的功能是否线程安全?e、 gKotlin通道在协同程序中是否使用线程安全/同步/保持在关系发生之前?,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(真) }
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
之间的时间顺序没有相关性。这也适用于阻塞队列
。但我想知道你所说的“提前执行”到底是什么意思,你怎么知道什么时候执行了?实际上,我认为它对代码行为的影响最小(只影响循环中的等待时间)。