1.飢えモード、静的定数道
クラスはオブジェクトの作成に上にロードしたときと空腹の男モデルは、スレッドの同期の問題を回避する
デメリットを:簡単にリソースの無駄につながります
public class Single{
private static final Single instance = new Single();
private Single(){
}
public static Single getInstance(){
return instance;
}
}
静的コードブロック
public class Single{
private Single(){
}
private static Single instance;
static{
instance = new Single();
}
public static Single getInstance(){
return instance;
}
}
2.怠惰なスタイル
安全でない方法を通し、次のコードは、遅延ロードが、不安のスレッド、スレッドAの裁判官の成功が、失われ、その後、別のスレッドBで判断し、CPUを解き、その後、複数のインスタンスが存在します
class Single{
private static Single instance;
private Single(){
}
public static Single getInstance(){
if(instance == null){
instance = new Single();
}
return instance;
}
}
参加スレッド同期の問題解決に同期
短所:各スレッドは、この判断を行う際にスレッド同期に非効率的に来なければなりませんした後
public class Single{
private static Single instance;
private Single(){
}
public static synchronized Single getInstance(){
if(instance == null){
instance = new Single();
}
return instance;
}
}
ダブルは遅延ロードと効率の改善に取り組む方法(推奨)を、確認してください
class Single{
private static volatile Single instance;
private Single(){
}
public static Single getInstance(){
if(instance == null){
synchronized (Single.class){
if(instance == null){
instance = new Single();
}
}
}
return instance;
}
}
3.静的な内部クラスの方法(推奨)
getInstanceメソッドは静的クラスをロードすると、JVMロードされたクラスはスレッドセーフで呼び出すときにここでは、他のスレッドをクラスローディングするときのため、ここではスレッドセーフを避け、入力し、遅延ロードを実装することはできません
public class Single{
private Single(){
}
private static class Singleton{
private static final Single instance = new Single();
}
public static Single getInstance(){
return Singleton.instance;
}
}
4.列挙は、スレッドの安全性を解決し、直列化復元は、オブジェクトを作成防ぐことができます(強く推奨)
enum Single{
INSTACE;
public void test(){
System.out.println("测试代码");
}
}