`synchronized`使用不同

时间:2012-08-13 06:04:20

标签: scala scala-collections

在查看scala.collection.mutable.SynchronizedStack时,我注意到synchronized的使用方式不同,有些方法使用synchronized[this.type]形式

override def push(elem: A): this.type = synchronized[this.type] { super.push(elem) }
override def pushAll(xs: TraversableOnce[A]): this.type = synchronized[this.type] { super.pushAll(elems) }

和一些使用synchronized表格

override def isEmpty: Boolean = synchronized { super.isEmpty }
override def pop(): A = synchronized { super.pop }

有什么区别?

1 个答案:

答案 0 :(得分:6)

synchronized的签名(由AnyRef声明)是

final def synchronized[T0](arg0: => T0): T0

如果您将其用作

override def isEmpty: Boolean = synchronized { super.isEmpty }

然后你把它留给编译器来推断传递给synchronized的函数的返回类型(这里是Boolean)。如果你用它

override def push(elem: A): this.type = synchronized[this.type] {
  super.push(elem)
}

然后你明确指定了返回类型(这里是this.type)。我假设编译器不会推断出this.type - 它表明你确切地返回了this个对象 - 但它会推断SynchronizedStack或其中一个超类型,这不像this.type