質問
同期の側面を見て、いくつかのコードスニペットを調べていました。ロックはオブジェクトで起こると思います。 Javaの場合、オブジェクトへの参照のみがあります。 Javaは参照を使用してオブジェクトを調達してロックする必要があります。
参照がたまたまnullである場合はどうなりますか?これが壊れると感じています。これが機能する場合、ロックは参考文献でも発生する必要があります(これは私を打ち負かします)。誰かが私のためにこれを明確にすることができますか。
synchronized (formatters) {
if(formatters == null) {
prepareCache(feedId);
}
}
解決
によると このフォーラムに, 、および他の多くの関連リンク。フォーマッタがnullの場合、nullpointerexceptionがスローされます。
他のヒント
nullpointerexceptionを取得します。例えば:
class A {
public static void main(String[] ss) {
Object o = null;
synchronized (o) {
}
}
}
あなたにあげる:
Exception in thread "main" java.lang.NullPointerException
at A.main(A.java:4)
から 同期されたステートメント のセクション Java言語仕様:
"SynchronizedStatement: synchronized ( Expression ) Block"
...それ以外の場合、式の値がnullの場合、nullpointerexceptionがスローされます。」
SSSH、あなたはそれらが実際にあることを知っているはずではありません 参照 オブジェクトに!オブジェクトのように提示されているように、それらを実装する方法ではなく、それらを考えてください。オブジェクトクラスは単一のロックを提供するため、フォーマッタオブジェクトが継承されます。フォーマッタがたまたまnullである場合、その上で同期すると、nullpointerexceptionが投げられます。
可能であれば、実際に使用されているオブジェクトで同期しないでください。ロックを行うクラス内で作成するプライベートファイナルオブジェクトを同期します。この理由は、他の人が同期するのと同じオブジェクトを選択する可能性があるためです。つまり、このロックがどのような副作用があるかわからないことです。
うまくいきません。あなたは同期します オブジェクト, 、オンではありません 変数. 。変数がnullの場合、同期するオブジェクトはないため、例外がスローされます。