Kotlin同步

时间:2017-07-21 23:15:47

标签: java concurrency kotlin

我在过去几周一直在研究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吗?因为第二个线程在一个

之后运行

1 个答案:

答案 0 :(得分:2)

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

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