Javaのロック最適化
4412 ワード
ロックの競合を低減し,スレッド間でより効率的にデータを共有し,性能を向上させるために,スピンロック,適応スピンロック,ロック粗化,バイアスロックなどの技術を用いて同期最適化を行った.
おすすめ読書おすすめ読書スピンロック スレッドAが共有データを占有する時間が短い場合、スレッドBが到来すると保留する必要はなく(これはユーザ状態からカーネル状態への変換にかかわる)、スレッドBに空ループ(スピン)を先に実行させ、Aの実行が完了するまでBはデータを使用することができる. 物理マシンに複数のcpuがある場合、別のcpuにこの空のサイクルを実行させることができる.これは、スレッドBがcpuを占有しているのにそこで暇を消費していることを意味し、時間が経つと資源を浪費し、すべてのスピンを必要とする時間制限-適応スピンロック アダプティブスピンロック のスピン時間は固定する、前回同じロック上のスピン時間およびロックの所有者の状態に応じて が決定される.
ロック解除 synchronizedを使用する場合、JITはこのコードにスレッドセキュリティの問題がないと脱出分析で判断し、ロック消去 を行う.
ロック粗化 のほとんどの場合、ロックの粒度を小さくすることは良好である.ただし、特別な場合がある コードの一部が、1つのオブジェクトに対して繰り返しロックをかける場合、ループ内で同じオブジェクトに対して をロックするなど、リソースを浪費することになる. JITが連続する操作が同一のオブジェクトに対して繰り返しロックされていることを発見すると、ロック粗化 が行われる.
偏向ロック 業務競争の場合、データに対する同期原語 を消去する.
おすすめ読書おすすめ読書
void fun() {
Object obj = new Object();
synchronized (obj) {
System.out.println(obj);
}
}
//
// ,JIT
void fun() {
Object obj = new Object();
System.out.println(obj);
}
int i = 0;
Object obj = new Object();
while (i++ < 100) {
synchronized (obj){
// do something
}
}
//
synchronized (obj){
while(i++ < 100){
// do something
}
}