シングルトンは、最も簡単なデザインパターンの一つです。クラスのインスタンスが1つだけ、我々はこのモデルを使用することができる場合は、データベース接続など、効率を改善し、資源の浪費を避けることができます。
シングルトンデザインパターンは、2つのモード怠惰と空腹の人に分けることができます。
1、空腹の男:
パブリック クラスシングルトン{
プライベート 静的シングルトンシングルトン= 新しいシングルトン();
プライベートシングルトン(){}
パブリック 静的シングルトンのgetInstance(){
戻りシングルトン。
}
}
これは、一度にクラスがロードされているので、それは必要性の唯一のインスタンスを初期化し、飢えスタイルと呼ばれています。これは最も単純な実装である、プライベートconstructorプロパティには、このような第二のインスタンスがないことを保証します。授業時間がロードされているので、ケースとなっているので、この実装は、スレッドセーフです。
2、怠惰なスタイル
パブリック クラスSingleton2 {
プライベートSingleton2(){}
プライベート 静的 Singleton2 singleton2 = NULL ;
パブリック 静的Singleton2のgetInstance(){
場合(singleton2 == NULL ){
singleton2 = 新しいSingleton2()。
}
戻りsingleton2。
}
}
中国風飢えた、怠惰な人間と異なる場合にのみ、使用中に、一意のインスタンスを生成します。それはスレッドセーフではありませんので、しかし、そのためにも、アクセスするオブジェクトが影響を受ける可能性がありsingleton2とアクセス速度の数、および状況の複数のインスタンスの出現を変更し、別の問題を抱えていました。
3、怠惰式2.0
パブリック クラスSingleton2 {
プライベートSingleton2(){}
プライベート 静的 Singleton2 singleton2 = NULL ;
パブリック 静的 同期Singleton2のgetInstance(){
場合(singleton2 == NULL ){
singleton2 = 新しいSingleton2()。
}
戻りsingleton2。
}
}
同期とインスタンスメソッドを取得するには、同期機能、内部リソースへの排他的アクセスをする、我々はスレッドセーフの問題を解決することができます。しかし、新たな問題が巻き起こっているが、また、それに対処する必要があり、それは効率です。
4、怠惰式3.0
public class Singleton2 {
private Singleton2(){}
private static Singleton2 singleton2 = null;
public static Singleton2 getInstance(){
if(singleton2 == null){
synchronized (Singleton2.class){
if(singleton2 == null){
singleton2 = new Singleton2();
}
}
}
return singleton2;
}
}
注意到,如果使用同步函数,那么将会对内部所有代码上锁,意味着每次调用该实例,都要判断一下,效率很低。然而真正要考虑线程安全的地方仅仅是初始化实例的时候。所以为了提高效率,在锁代码块之前,先判断一下需不需要new实例,即是不是第一次访问。这样,大部分情况下不需要进同步块,提高了效率。
如有错误,欢迎批评指正。