これについてウェブを検索してきましたが、これに近い記事を見つけることができず、非常に驚いています. 私がまだ見つけていないどこかに知恵が隠されているのかもしれません。
さまざまなタイプの 10 個のメンバーを持つクラスがあり (簡単にするために、int と String が混在しているとします)、それぞれに独自のアクセサー メソッドがあるとします。ここで、このクラスをスレッドセーフにしたいと考えています。ただし、これらのデータ メンバーの一部は、必ずしも相互にやり取りするとは限りません。たとえば、Person
以下のクラスにはage
、name
およびその他のプロパティがあります。
public class Person {
private volatile int age;
private String name;
private volatile long blabla;
// ... and so on
public synchronized int getAge() {
return age;
}
public synchronized void setAge(int age) {
this.age = age;
}
// .. and so on for each data member
}
1 つのスレッドは読み取り/書き込みage
のみが必要で、他のスレッドは変更のみが必要な場合がありname
ます。明らかに、synchronized
すべてのアクセサー メソッドに追加することは、オブジェクトのインスタンス全体をロックするため、悪い考えです。呼び出しているスレッドは、呼び出してgetAge()
いる別のスレッドを待つ必要がありますが、とは 2 つの別個のフィールドです。getName()
age
name
したがって、明らかな解決策の 1 つは、フィールドごとにロックを作成する (またはvolatile
プリミティブ型に追加する) ことです。ただし、これはやり過ぎのようです。10 個のデータ メンバーがある場合、10 個のロックも必要ですか? 過度のロックなしでこれを達成する別の方法があるかどうか疑問に思っています。