javaソースコードごと再入可能ロックと同期の実装方法が異なる
ReentrantLockのロック(不公平)は以下のとおりです。
public boolean lock(){
int c=getState();
if(c==0){
compareAndSetState(0,1);
}
}
//getState method
public int getState(){
return state;
}
public boolean compareAndSetState(int expected,int update){
unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
とstateOffSetの値(リフレクションを使用して)メモリに状態のオフセットされています。上記のコードからわかるように、lock.lock()を呼び出すと、の最初の値のフィールドがチェックインされ、ゼロの場合は呼び出しスレッドのみがロックされます。
だから私の質問は私たちのユーザーが同期したキーワードですか? Synchronizedでロックのいくつかのフィールドもチェックされ、設定されていますか?
もう1つ疑問ですが、どこかで私はリエントラントロックで複数の待機キューを許可していますが、それはどういう意味ですか?
"(反射を使用)" - いいえ、反射は使用されていません。ここでは役に立たないし、遅すぎるかもしれない。同期の仕組みを知るには、同期の仕組みに関するチュートリアルを読んでください。ReentrantLockの実装はReentrantLockと同じではありませんが、かなり似ていますが、すべてではない多くの目標を達成しています(ReetrantLockを必要としない場合) –
grepcodeによると、私はstateOffset = unsafeを見ることができます。 objectFieldOffset(AbstractQueuedSynchronizer.class.getDeclaredField( "state")); of-course ReentrantLockは、私が書いた以上のものですが、ReentrantLockのstateの値の質問では、ロックが利用可能であるか、他のスレッドによってロックされています。 Synchronizedで何が起こるのですか?私は、Synchronizedを使用するときに内部的にjvmが何をしているのかを知ることができませんでした。 – Nishat