14

Scala には、AnyRef を拡張する任意のオブジェクトで同期できる AnyRef の同期メソッドがあります。ただし、AnyRef では抽象的であり、scala ソースを grep してどのように機能するかを理解できませんでした。Java の synchronized キーワードを利用することで機能するようです。そうですか?

4

2 に答える 2

32

1)AnyRef.synchronizedは、ソース コードには存在しない魔法のメソッドですが、コンパイラを起動するたびにコンパイラのシンボル テーブルに挿入されます: Definitions.scala。ちなみに、多くの魔法のメソッドとクラスがあります ( Definitions.scala )。

2) メソッドが でラップされている場合、ラッピングは破棄され、メソッドはフラグ ( UnCurry.scalathis.synchronized )で内部的に注釈が付けられ、JVM の `ACC_SYNCHRONIZED メソッド アクセス フラグ ( GenASM.scala ) にマップされます。SYNCHRONIZED

3) への他の呼び出しsynchronizedはバックエンドのプリミティブSYNCHRONIZED( backend/ScalaPrimitives.scala ) にマップされ、後で monitorenter/monitorexit ( GenICode.scala #1GenICode.scala #2 ) に下げられます。

于 2013-07-13T07:29:56.027 に答える