【发布时间】: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