Javaメモリモデル
メインメモリとワーキングメモリ:
Javaメモリモデルは、すべての変数がメインメモリにあり、各スレッドが独自のワーキングメモリを持つことを規定しています。
作業メモリには、スレッドが使用するメインメモリのコピーが保存されます。スレッドによる変数の操作はすべて作業メモリ内で実行される必要があります。
メモリ間の相互作用:
1つのロックはメインメモリ内の変数に作用し、変数をスレッド排他的な状態として識別します。
2 ロック解除 メインメモリ内の変数に作用し、ロックされた変数を解放します
3 読み取り ワーキングメモリ内の変数に作用し、変数の値をメインメモリからスレッドのワーキングメモリに転送します。
4loadはワーキングメモリの変数に作用し、read操作でメインメモリから取得した変数値をワーキングメモリの変数のコピーに置きます
5useはワーキングメモリの変数に作用し、ワーキングメモリ内の変数の値を実行エンジンに転送します
6 assignはワーキングメモリ内の変数に作用し、実行エンジンから受け取った値をワーキングメモリ内の変数に代入します
7 storeは変数に作用します作業メモリ内の変数の値をメインメモリに転送します。
8 write はメインメモリ内の変数に作用し、ストア操作によって作業メモリから取得した変数の値をメインメモリに置きます
変数が volatile として定義されると、変数は 2 つの特性を持つことになります
1.この変数を保証するすべてのスレッドに対する可視性は、非アトミック操作ではまだスレッドセーフではありません。
2 命令の並べ替えの最適化を無効にします。
原子性、可視性、秩序性
先着順原理
Javaスレッドの状態遷移
New New Create後縁未開始純血種はこの状態です
Running Runnableにはオペレーティングシステムのスレッドステータスが含まれますRunningとReady inこの状態では、この状態のスレッドが実行中であるか、CPU が実行時間を割り当てるのを待っている可能性があります
無期限に待機しています 待機中 この状態のスレッドには CPU 実行時間が割り当てられません。明示的に待機する必要があります他のスレッドによって起動される: Timeout パラメータを設定しない Object.wait() メソッド; Timeout パラメータを設定しない Thread.join() メソッド
Timed Waiting はこの状態にあり、スレッドには CPU 実行時間が割り当てられません。ただし、他のスレッドが明示的に起動されるのを待つ必要はありません。スレッドは、Timeout パラメータを設定した Thread.sleep() メソッドによってシステムによって自動的に起動されます。 Timeout パラメータが設定された .join() メソッド; LockSupport.parkNanos() メソッド; LockSuport.parkUnitl() メソッド
Blocked 排他的ロックの取得を待機中
End Terminated 終了したスレッドのステータス