Scala中synchronized锁的不同写法是否等效?求官方文档参考
Scala中synchronized不同写法的异同
先直接给结论:
- 你看到的
lock synchronized { ... }和Object synchronized { ... }(这里的Object指具体对象实例)功能完全一致,都是Scala语法糖的写法,本质是调用目标对象的synchronized方法。 - 它们和你提到的
synchronized(Object)(Java风格写法)功能等价,只是Scala更推荐用中缀表示法的语法糖。 - 而“带synchronized的函数”本质是用当前实例作为锁对象的同步代码块,和前面几种写法的核心差异在于锁对象的不同。
详细拆解
- 语法糖本质
Scala允许对只有一个参数的方法使用中缀表示法,即省略方法调用的点和括号。java.lang.Object的synchronized方法接收一个代码块参数(类型为=> T),所以:
lock synchronized { ... }
完全等价于:
lock.synchronized({ ... })
这和Java里的synchronized(lock) { ... }是同一个逻辑——以lock为监视器锁,保证代码块的线程安全。
如果你的Object synchronized { ... }里的Object是某个具体对象(比如单例对象或普通实例),那逻辑和上面完全一致,只是锁对象换成了这个Object实例。注意如果是大写的Object(Scala的根类),这是错误写法,因为类不能直接调用实例方法。
- 与带synchronized的函数的差异
带synchronized的函数写法,比如:
def safeMethod(): Unit = synchronized { // 线程安全逻辑 }
等价于:
def safeMethod(): Unit = this synchronized { // 线程安全逻辑 }
也就是固定用当前类的实例(this)作为锁对象,而前面的写法可以自由指定任意对象作为锁,灵活性更高。
官方语法依据
Scala语言规范中明确规定:当实例方法仅接收一个参数时,x.m(y)可简写为x m y;若参数是花括号包裹的代码块表达式,还可省略括号写成x m { ... }。synchronized方法恰好符合这个规则,因此可以使用中缀表示法的语法糖。
内容的提问来源于stack exchange,提问作者anatmy
相关产品推荐
相关产品推荐

