问题描述
Controller().threadtest()
Controller().threadtest()
我的Controller类是:
class Controller{
fun threadtest(){
Thread(Runnable{
threadOperation()
}).start()
}
@Synchronized
private fun threadOperation(){
println("Thread start")
Thread.sleep(3000)
println("Thread finish")
}
}
但是@Synchronized无法正常工作,因为我的日志是:
Thread start
Thread start
Thread finish
Thread finish
我做错了什么?
解决方法
@Synchronized
批注仅阻止在同一实例上的调用中并发执行函数。就您而言,您正在创建Controller()
的两个实例。
如果您修改调用代码,使其仅创建类的一个实例,则您将获得预期的行为(一次执行调用),例如:
val controller = Controller()
controller.threadTest()
controller.threadTest()
或者,如果您需要相互排斥多个Controller
实例上的并发调用,则必须将@Synchronized
移到另一个实例,两个Controller
都将引用该实例或使用其他并发实用程序,例如withLock
调用共享锁。