[Java同時-4]Javaロック関連
Javaロックのタイプ
Java言語で提供されるロックのタイプ
スピンロック:成功するまでCAS操作を繰り返します.スピンロックはCPUリソースを放棄しません. 楽観ロック:データの同時操作が衝突していないと仮定し、すべてのスレッドがデータを修正することができ、修正時にデータが以前と一致しているかどうかを判断し、一致すれば修正に成功し、一致していない修正に失敗します.悲観ロック:データの同時操作が競合していると仮定し、データの任意の操作を同期します.すべてのスレッドを並べてデータを読み書きします. 独自のロック:リソースに書き込みロックを追加し、現在のスレッドだけがデータを読み書きでき、他のスレッドはデータを読むことも、データを書くこともできません.小結:データを読み書きできるスレッドは1つしかありません. 共有ロック:リソースにリードロックを追加し、現在のスレッドはデータを読むことができますが、データを書くことはできません.他のスレッドでは、リソースに読み取りロックを追加することもできますが、書き込みロックは追加できません.小結:複数のスレッドはデータを読むことができ、スレッドがデータを書くことができない.再ロック可能/再ロック不可:1つのロックで、複数のリソースをロックできます.再入可能ロックとは、スレッドがロックを取得した後、ロックの同期に入ることができる他のコードブロックを指す.再入不可ロックとは、スレッドがロックを取得した後、ロックの同期に入ることができない他のコードブロックで、入るには再びロックを取得する必要があることを意味します. 公平錠/非公平錠:時間順に錠を受け取るかどうか.フェアロックは先着順であり、非フェアロックは割り込みを許可してロックを取得することである.
同期キーsynchronized
synchronizedの概要
Java言語では、各オブジェクトがロックとして機能し、具体的な表現形式:synchronized修飾の一般的な同期方法では、ロックは現在のオブジェクトであり、静的同期方法であれば、ロックは現在のクラスのClassオブジェクトであり、同期コードブロックであれば、ロックはカッコ内のオブジェクトである.synchronized同期の本質は,各オブジェクトにモニタモニタオブジェクトがあり,モニタを出入りすることによってメソッド同期とコードブロック同期を実現することである.Monitorに入る命令はmonitorenterであり、Monitorを終了する命令はmonitorrexitであり、一度に1つのスレッドしかなく、Monitorに入ることができ、他のスレッドがMonitorに入ることを試みるとブロック状態に入る.synchronizedは同期だけでなく,可視性と原子性も保証できる.
ジルコニアsynchronizedロックの特徴は、悲観的なロック、独創的なロック、再ロックが可能であることです.一部のシーンでは、JVMはsynchronizedロックを最適化します.たとえば、ロックの太さ、ロックの除去などです.例を2つ挙げます.
synchronizedロックの原理
HotSpot仮想マシンでは、オブジェクトはメモリの3つの部分から構成されています.オブジェクトヘッダ、インスタンスデータ、整列フィルタです.オブジェクトヘッダには、Mark Word、Class Metadata Address、Array Lengthの3つの部分があります.これら3つは32ビット仮想マシンで,占有メモリサイズはいずれも32 bit,64ビット仮想マシンでは64 bitである.synchronizedロックの情報は、Mark Wordエリアに存在します.
Java言語で提供されるロックのタイプ
スピンロック:成功するまでCAS操作を繰り返します.スピンロックはCPUリソースを放棄しません. 楽観ロック:データの同時操作が衝突していないと仮定し、すべてのスレッドがデータを修正することができ、修正時にデータが以前と一致しているかどうかを判断し、一致すれば修正に成功し、一致していない修正に失敗します.悲観ロック:データの同時操作が競合していると仮定し、データの任意の操作を同期します.すべてのスレッドを並べてデータを読み書きします. 独自のロック:リソースに書き込みロックを追加し、現在のスレッドだけがデータを読み書きでき、他のスレッドはデータを読むことも、データを書くこともできません.小結:データを読み書きできるスレッドは1つしかありません. 共有ロック:リソースにリードロックを追加し、現在のスレッドはデータを読むことができますが、データを書くことはできません.他のスレッドでは、リソースに読み取りロックを追加することもできますが、書き込みロックは追加できません.小結:複数のスレッドはデータを読むことができ、スレッドがデータを書くことができない.再ロック可能/再ロック不可:1つのロックで、複数のリソースをロックできます.再入可能ロックとは、スレッドがロックを取得した後、ロックの同期に入ることができる他のコードブロックを指す.再入不可ロックとは、スレッドがロックを取得した後、ロックの同期に入ることができない他のコードブロックで、入るには再びロックを取得する必要があることを意味します. 公平錠/非公平錠:時間順に錠を受け取るかどうか.フェアロックは先着順であり、非フェアロックは割り込みを許可してロックを取得することである.
同期キーsynchronized
synchronizedの概要
Java言語では、各オブジェクトがロックとして機能し、具体的な表現形式:synchronized修飾の一般的な同期方法では、ロックは現在のオブジェクトであり、静的同期方法であれば、ロックは現在のクラスのClassオブジェクトであり、同期コードブロックであれば、ロックはカッコ内のオブジェクトである.synchronized同期の本質は,各オブジェクトにモニタモニタオブジェクトがあり,モニタを出入りすることによってメソッド同期とコードブロック同期を実現することである.Monitorに入る命令はmonitorenterであり、Monitorを終了する命令はmonitorrexitであり、一度に1つのスレッドしかなく、Monitorに入ることができ、他のスレッドがMonitorに入ることを試みるとブロック状態に入る.synchronizedは同期だけでなく,可視性と原子性も保証できる.
ジルコニアsynchronizedロックの特徴は、悲観的なロック、独創的なロック、再ロックが可能であることです.一部のシーンでは、JVMはsynchronizedロックを最適化します.たとえば、ロックの太さ、ロックの除去などです.例を2つ挙げます.
private int i;
private int j;
public void syn(){//
synchronized (this) {
i++;
}
synchronized (this) {
j++;
}
}
public void syn(){//
synchronized (this) {
i++;
j++;
}
}
public void test(){
//append synchronized , ,JVM Monitor 。 str1 。
StringBuffer str1 = new StringBuffer();
str1.append("a");
str1.append("a");
str1.append("a");
}
synchronizedロックの原理
HotSpot仮想マシンでは、オブジェクトはメモリの3つの部分から構成されています.オブジェクトヘッダ、インスタンスデータ、整列フィルタです.オブジェクトヘッダには、Mark Word、Class Metadata Address、Array Lengthの3つの部分があります.これら3つは32ビット仮想マシンで,占有メモリサイズはいずれも32 bit,64ビット仮想マシンでは64 bitである.synchronizedロックの情報は、Mark Wordエリアに存在します.