これがシングルトン パターンのカスタム クラスです。このコードでは、以下のようにダブルチェック ロックを使用しています。いくつかの情報源に関する多くの投稿を読んだところ、2 つのスレッドが同時に実行されて 2 つの異なるオブジェクトが作成されるのを防ぐため、ダブル チェックが役立つと彼らは言っています。
public class DoubleCheckLocking {
public static class SearchBox {
private static volatile SearchBox searchBox;
// private constructor
private SearchBox() {}
// static method to get instance
public static SearchBox getInstance() {
if (searchBox == null) { // first time lock
synchronized (SearchBox.class) {
if (searchBox == null) { // second time lock
searchBox = new SearchBox();
}
}
}
return searchBox;
}
}
私はまだ上記のコードをあまり理解していません。instance が null のときに 2 つのスレッドが一緒に同じコード行を実行すると、何が問題になりますか?
if (searchBox == null) {
synchronized (SearchBox.class) {
if (searchBox == null) {
searchBox = new SearchBox();
}
}
}
それが現れるとき。2 つのスレッドの両方で、オブジェクトが null であることがわかります。その後、両方が同期します。その後、再度チェックしても null が表示されます。2 つの異なるオブジェクトを作成します。おっと。
説明してください。私は何を間違って理解していますか?
ありがとう :)