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吗? 因为第二个线程在一个之后运行

nahblah建立了一个与自己不同的线程。 所以当他们每次调用start ,他们只是标记线程调度器来启动它们。 start立即返回,并且当前线程继续运行代码的主线,直到发生某种事情使其延迟。 在这一点上,调度程序是这样做的:运行任何已经准备好并等待运行的东西。 你不应该期望一个特定的顺序,也不应该预测一个订单。 这就是为什么你有你的代码中使用同步结构。

你可以在一个单线程Executor上运行你的任务,就像在这个答案中一样(对于java而言,你将不得不适应)。