【问题标题】:Kotlin SynchronizedKotlin 同步
【发布时间】:2017-07-21 23:15:47
【问题描述】:

最近几周我一直在研究 java 多线程。我了解了同步,并了解同步可以避免多个线程同时访问相同的属性。 我写这段代码是为了在同一个线程上运行两个线程。

val gate = CyclicBarrier(3)
val obj = SynchronizedCounter()

var nah = object : Thread() {
    override fun run() {
        gate.await()
        obj.increment()
    }
}

var blah = object : Thread() {
    override fun run() {
        gate.await()
        println(obj.value())
    }
}

nah.start()
blah.start()

gate.await()

class SynchronizedCounter {
    private var c = 0

    @Synchronized
    fun increment() {
        c++
    }

    @Synchronized
    fun decrement() {
        c--
    }

    @Synchronized
    fun value(): Int {
        return c
    }
}

输出:0 不会返回 1?因为第二个线程在第一个线程之后运行

【问题讨论】:

  • 这里没有理由期望特定的执行顺序。
  • 这里是操作系统线程调度器。它遵循自己的政策
  • @OliverCharlesworth 关于同步注释?在这个例子中,有两个线程访问同一个对象。
  • 您应该首先了解发生了什么。如果您将await 更改为第一个线程中的最后一条语句。那么您始终可以看到预期的结果1

标签: java concurrency kotlin


【解决方案1】:

nahblah 都将作业设置为在与它们自己不同的线程上运行。因此,当他们每个调用start 时,他们只是在标记线程调度程序以启动它们。 start 立即返回,当前线程继续运行主代码行,直到发生某些事情使其延迟。那时,调度程序会做它的事情,运行任何准备好并等待运行的东西。你不应该期待一个特定的订单,也不应该试图预测一个订单。这就是您在代码中使用同步构造的原因。

您可以在this SO 回答中的单线程执行器上运行您的任务(不过对于 java,您必须适应)。

【讨论】:

    猜你喜欢
    • 2019-11-11
    • 2020-09-14
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2016-04-22
    • 1970-01-01
    相关资源
    最近更新 更多