同步注释在Kotlin中不起作用

问题描述

我有一个前台服务,并且正在执行此方法

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调用共享锁。