You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala中synchronized锁的不同写法是否等效?求官方文档参考

Scala中synchronized不同写法的异同

先直接给结论:

  • 你看到的lock synchronized { ... }和Object synchronized { ... }(这里的Object指具体对象实例)功能完全一致,都是Scala语法糖的写法,本质是调用目标对象的synchronized方法。
  • 它们和你提到的synchronized(Object)(Java风格写法)功能等价,只是Scala更推荐用中缀表示法的语法糖。
  • 而“带synchronized的函数”本质是用当前实例作为锁对象的同步代码块,和前面几种写法的核心差异在于锁对象的不同。

详细拆解

  1. 语法糖本质
    Scala允许对只有一个参数的方法使用中缀表示法,即省略方法调用的点和括号。java.lang.Object的synchronized方法接收一个代码块参数(类型为=> T),所以:
lock synchronized { ... }

完全等价于:

lock.synchronized({ ... })

这和Java里的synchronized(lock) { ... }是同一个逻辑——以lock为监视器锁,保证代码块的线程安全。

如果你的Object synchronized { ... }里的Object是某个具体对象(比如单例对象或普通实例),那逻辑和上面完全一致,只是锁对象换成了这个Object实例。注意如果是大写的Object(Scala的根类),这是错误写法,因为类不能直接调用实例方法。

  1. 与带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:30:49