Scala には、AnyRef を拡張する任意のオブジェクトで同期できる AnyRef の同期メソッドがあります。ただし、AnyRef では抽象的であり、scala ソースを grep してどのように機能するかを理解できませんでした。Java の synchronized キーワードを利用することで機能するようです。そうですか?
質問する
2317 次
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 #1、GenICode.scala #2 ) に下げられます。
于 2013-07-13T07:29:56.027 に答える