私にはSpring有線Beanとしてマネージャーがいます。デフォルトで春に定義されているすべてのBeanは、シングルトンとして配線されていると思います。このBeanには、同期する必要のあるメソッドがいくつかあります。それならどうすればいいの?
void zzz() {
synchronized (this) {
...
}
}
また
void zzz() {
synchronized (MyClass.class) {
...
}
}
?
私にはSpring有線Beanとしてマネージャーがいます。デフォルトで春に定義されているすべてのBeanは、シングルトンとして配線されていると思います。このBeanには、同期する必要のあるメソッドがいくつかあります。それならどうすればいいの?
void zzz() {
synchronized (this) {
...
}
}
また
void zzz() {
synchronized (MyClass.class) {
...
}
}
?
2つの主な違いは、最初のケースでは、クラスのインスタンスがモニターとして使用され、2番目のケースではクラスがモニターとして使用されることです。
近い将来、クラスのインスタンスを多数持つことにした場合、それらのメソッドはそれぞれのインスタンスで同期されるため、最初の方法がおそらくあなたのケースに当てはまる方法です。クラスをモニターとして使用する場合とは対照的に、1つのスレッドが1つのインスタンスで同期メソッドを呼び出している場合、他のスレッドは同じクラスのインスタンスでメソッド(同期されているメソッド)を呼び出すことができません。
可変の静的クラス変数にアクセスしている場合を除いて(最初は厄介な可能性があります)、最初の方法が同期の適切な方法です。
SpringはシングルトンBeanのインスタンスを1つだけ作成し、そのタイプのBeanに依存しているすべてのユーザーに使用しますが、シングルトンは静的エンティティではないことを理解してください。Springコンテキストの外部でそのクラスを自分でインスタンス化することを妨げるコンパイラーの制約はありません。Springがそれらをこれ以上作成しないことを知っているので、それは単に唯一のインスタンスです...それができないからではありません。ここで私が言いたいのは、クラスレベルのデータとシングルトンのデータの間に類似点を描くのは間違っていることに国境を接するのは難しいということです。
当然の結果として、同期は可能な限り狭い範囲で行われる必要があります。あなたの場合、それは、クラス全体のより広いスコープではなく、共有データを含むオブジェクトインスタンスで同期することを意味します。