2011年7月19日火曜日

javaのFutureTask.getがブロック/起きる仕組み

第2回JVMソースコードリーディングの会に参加しました。
最初のクラスファイルVerifierは思ったよりおもしろくて、あんな風にスタックに積まれる値の型チェックしてるんだなーと。ただ、あんなのを毎回やってたら確かに起動が重くなりそうな気もする。起動時に-Xverify:noneで起動すると、どこまでVerifyがオフになるかは調べておきたい。

java.util.concurrentはUnsafeに触らなかったので、FutureTask.getの仕組みあたり。
調べたので簡単に書いておく。

FutureTask.getがブロックするのはpark
  • FutureTask.get
  • FutureTask.Sync.innerGet
  • AbstractQueuedSynchronizer.acquireSharedInterruptibly
  • AbstractQueuedSynchronizer.doAcquireInterruptibly
  • AbstractQueuedSynchronizer.parkAndCheckInterrupt
  • LockSupport.park
  • Unsafe.park
FutureTask.getが起きるのはunpark.(以下はExecutoreの場合)
  • ExecutoreがTask.runを呼び出す(例えばThreadPoolExecutor.runWorker)
  • FutureTask.run
  • FutureTask.Sync.innerRun
    • FutureTask.set(結果セット)
      • FutureTask.Sync.innerSet
      • AbstractQueuedSynchronizer.releaseShared
      • AbstractQueuedSynchronizer.doReleaseShared
      • AbstractQueuedSynchronizer.unparkSuccessor
      • LockSupport.unpark
      • Unsafe.unpark
    • FutureTask.cancel
      • FutureTask.Sync.innerCancel
      • AbstractQueuedSynchronizer.releaseShared
      • 後は結果セット時と同じ

0 件のコメント:

コメントを投稿