これらは, HotSpot 内でのスレッド制御用のクラス. より具体的に言うと, スレッドを待機状態にさせる(ブロックさせる)ためのユーティリティ・クラス (See: here and here for details).
java.util.concurrent (JSR 166) の機能を実現するためのクラス.
より具体的に言うと, java.util.concurrent.locks.LockSupport.park(), および java.util.concurrent.locks.LockSupport.unpark() のためのクラス. 実際にスレッドを待機状態にさせる(ブロックさせる)処理, および待機状態から復帰させる処理を行う (See: here for details).
なお似たような機能を提供しているクラス(スレッドを待機状態にさせるクラス)として ParkEvent クラスが存在する (See: ParkEvent). コメントによると, 将来的には Parker クラスは廃止して ParkEvent に統一したい (重複箇所が多いので), とのこと.
((cite: hotspot/src/share/vm/runtime/park.hpp))
/*
* Per-thread blocking support for JSR166. See the Java-level
* Documentation for rationale. Basically, park acts like wait, unpark
* like notify.
*
* 6271289 --
* To avoid errors where an os thread expires but the JavaThread still
* exists, Parkers are immortal (type-stable) and are recycled across
* new threads. This parallels the ParkEvent implementation.
* Because park-unpark allow spurious wakeups it is harmless if an
* unpark call unparks a new thread using the old Parker reference.
*
* In the future we'll want to think about eliminating Parker and using
* ParkEvent instead. There's considerable duplication between the two
* services.
*
*/
((cite: hotspot/src/share/vm/runtime/park.hpp))
class Parker : public os::PlatformParker {
以下の箇所に(のみ)格納されている.
各 JavaThread オブジェクトの _parker フィールド
Parker クラスの FreeList フィールド (static フィールド)
(正確には, このフィールドは Parker の線形リストを格納するフィールド(フリーリスト). Parker オブジェクトは FreeNext フィールドで次の Parker オブジェクトを指せる構造になっている. このフィールドの線形リストに全ての未使用な Parker オブジェクトがつながれている.)
See: here for details
Parker::Allocate() 内で(のみ)生成されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
JavaThread::JavaThread() -> JavaThread::initialize() -> Parker::Allocate()
以下の箇所で(のみ)使用されている.
* java.util.concurrent の処理 (java.util.concurrent.locks.LockSupport.park() および java.util.concurrent.locks.LockSupport.unpark() の処理) (略) (See: here for details) -> Unsafe_Park() -> Parker::park() (略) (See: here for details) -> Unsafe_Unpark() -> Parker::unpark() * java.lang.Thread.interrupt() の処理 (java.util.concurrent.locks.LockSupport.park() で待機しているスレッドに割り込む処理) (略) (See: here for details) -> os::interrupt() -> * Linux の場合 -> Parker::unpark() * Solaris の場合 -> Parker::unpark() * Windows の場合 -> Parker::unpark()
実際の処理のほとんどは os::PlatformParker クラスに丸投げしている.
See: here for details
スレッドの待機処理用のユーティリティ・クラス.
スレッドを待機状態にさせる機能(ブロックさせる機能), および待機状態から復帰させる機能を提供している (See: here for details).
(<= 要するに, pthread_cond_wait() や WaitForSingleObject() のラッパークラス)
以下の箇所に(のみ)格納されている.
各 Thread オブジェクトの _ParkEvent フィールド
各 Thread オブジェクトの _SleepEvent フィールド
各 Thread オブジェクトの _MutexEvent フィールド
各 Thread オブジェクトの _MuxEvent フィールド
ParkEvent クラスの FreeList フィールド (static フィールド)
(正確には, このフィールドは ParkEvent の線形リストを格納するフィールド(フリーリスト). ParkEvent オブジェクトは FreeNext フィールドで次の ParkEvent オブジェクトを指せる構造になっている. このフィールドの線形リストに全ての未使用な ParkEvent オブジェクトがつながれている.)
See: here for details
ParkEvent::Allocate() 内で(のみ)生成されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
Thread::Thread()
Thread::muxAcquireW()
Monitor::jvm_raw_lock() (ただし, ここで生成された ParkEvent はこの関数内でしか使わておらず, この関数内でフリーリストに戻される)
HotSpot 内の様々な箇所で使用されている (ロック待ちの処理, sleep 処理, wait 処理, 等) (#TODO).
実際の処理のほとんどはスーパークラスの os::PlatformEvent クラスに丸投げしている.
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.