簡単な質問がありますが、答えを見つけるのに問題があります。
問題は、同期メソッドが同期(this) と等しいかどうかです-同じロックを行うことを意味します。
スレッド ロックを減らしたスレッド セーフなコードを書きたい (常に同期されたメソッドを使用するのではなく、部分的な同期クリティカル セクションのみを使用する場合がある)。
このコードが等しいかどうか、またその理由を短い言葉で説明していただけますか (例はアトミックな問題を示すために単純化されています)。
例
この混合ロック コードは、以下のブルート フォース コードと同じですか。
public class SynchroMixed {
int counter = 0;
synchronized void writer() {
// some not locked code
int newCounter = counter + 1;
// critical section
synchronized(this) {
counter = newCounter;
}
}
synchronized int reader() {
return counter;
}
}
ブルート フォース コード (各メソッドは、重要でないセクションを含めてロックされています。
public class SynchroSame {
int counter = 0;
synchronized void writer() {
int newCounter = counter + 1;
counter = newCounter;
}
synchronized int reader() {
return counter;
}
}
または、このコードを作成する必要があります (これは確かに有効ですが、よりマイクロコーディングで不明確です)。
public class SynchroMicro {
int counter = 0;
void writer() {
// some not locked code
int newCounter = counter + 1;
// critical section
synchronized(this) {
counter = newCounter;
}
}
int reader() {
synchronized (this) {
return counter;
}
}
}