"IBM dw:Java theory and practice: Synchronization optimizations in Mustang"
http://www-128.ibm.com/developerworks/java/library/j-jtp10185/
Javaの理論と実践シリーズは多くが日本語訳されていますが、この記事は英語のみです。
概要
複数スレッドで共有する可変データは、あるスレッドでの更新内容を別なスレッドから適切に見えるためには同期が必要。
ロックは2つに大別
- ほとんど競合する(contended)
- ほとんど競合しない(uncontended)
大半の使い方では競合はないので、後者のパフォーマンスを向上すればアプリケーション全体のパフォーマンスも良くなる。以下3つの技法がある。
ロック回避(lock elision)
他のスレッドで全く使われていないロックを使うsynchronizedブロックは無意味なので最適化によって除去する。ロックが使われているかどうかを解析するのにエスケープアナリシスも利用される。
適応ロック(adaptive locking)
ロックの解放待ちが短い時間ですむときはスピンロックで待ち、長い時間かかるときはスレッドをサスペンドし再スケジューリングに委ねる。そのロックが獲得されている時間が短いか長いかは、プロファイリングされる。
ロック粗大化(lock coarsening)
前後するコードで同じロックオブジェクトを使用する複数の同期ブロックがあれば一つにまとめてしまう。