我在过去几周一直在研究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吗?因为第二个线程在一个
之后运行答案 0 :(得分:2)
nah
和blah
都将作业设置为在与自己不同的线程上运行。因此,当他们每次调用start
时,他们只是标记线程调度程序来启动它们。 start
立即返回,当前线程继续运行主代码行,直到发生某些事情使其延迟。此时,调度程序会执行它,运行任何已准备好并等待运行的东西。您不应该期望特定订单,也不应该尝试预测订单。这就是为什么你要在你的代码中使用同步结构。
你可以在this SO回答中的单线程执行程序上运行你的任务(对于java,你必须适应)。