java单例模式下面两种方法有什么区别?
方法一:
public class SingleTon {
private static SingleTon singleTon;
private SingleTon(){
}
public synchronized static SingleTon getSingleTon(){
if(singleTon == null){
singleTon = new SingleTon();
}
return singleTon;
}
}
方法二:
public class SingleTon {
private static SingleTon singleTon = new SingleTon();
private SingleTon(){
}
public synchronized static SingleTon getSingleTon(){
return singleTon;
}
}
请教一下这两种方法的区别是什么,哪个更好?
方法 1 は同時実行を使用し、パフォーマンスを消費するため、方法 2 の方が優れています。
遅延モードと空腹モードです。簡単に言うと、遅延読み込みです。こういうのが良いかどうかは現場次第なので何とも言えません。
方法 2 は同時実行のみを準備します。つまり、同時アクセスがあるかどうかは、このクラスのユーザーによって決定されます。
これら 2 つのタイプには、それぞれ独自の長所と短所があります。最初のメソッドはロードに時間がかかりますが、シングルトン オブジェクトの取得に時間がかかります。これは、判定が使用され、実行時に新しいオブジェクトが取得されるためです。2 番目のメソッドは、クラスのロードに時間がかかりますが、取得に時間がかかります。クラスがロードされるときに静的メンバーが初期化されるため、同時に、オブジェクトへの参照を返すだけで新しいオブジェクトが関与しないため、2 番目のメソッドを同期する必要はありません。
これは、シングルトン モードの 2 つの設計方法です。どちらも同時実行性とスレッドの安全性の問題を防ぐために同期を使用します。ただし、1 つ目は怠け者の設計方法であり、2 つ目はハングリーマンの設計方法です。プログラム自体がオブジェクトを取得するタイミングが違うだけです
シングルトン モードに関しては、実際には 5 つの方法があります:
遅延モードは、最初のコードに対応します。利点は次のとおりです。欠点は、インスタンスを取得するたびにロックの同期が必要となり、リソースが無駄になることです。
Hungry Man モードは 2 番目のコードに対応します。利点は次のとおりです。欠点は、起動するとすぐにロードされるため、リソースが無駄になることです。
ダブルチェックロックのレイジーモード。
静的内部クラスの遅延モード。
Effective Java では、シングルトンを実装するために enum を使用することをお勧めします。
2 つの違いは、メソッド 1 は遅延ロードであり、このメソッドが呼び出されない場合、オブジェクトは生成されませんが、後者は、クラスが使用されているかどうかに関係なく、クラスをロードするときにインスタンスを生成します。
リーリー最も典型的な遅延読み込み方法は次のようになります
これにより時間が節約され、新しいオブジェクトは作成されません。
さらに、同時実行状況が非常に高い場合は、volatile を使用してインスタンスを変更できます。
----------コードをよく見ていなかったので、何か追加します----------
getInstance メソッドに同期ロックを設定していることがわかりました。これは完全に不要です。その後の同期は完全に時間の無駄です。