Singleton 모드 (Singleton) : 클래스에 인스턴스가 하나만 있는지 확인하고 액세스 할 수있는 전역 액세스 포인트를 제공합니다.
특징 :
- 싱글 톤 클래스는 하나의 인스턴스 만 가질 수 있습니다.
- 싱글 톤 클래스는 고유 한 인스턴스를 만들어야합니다.
- 싱글 톤 클래스는이 인스턴스를 다른 모든 객체에 제공해야합니다.
게으른 남자와 배고픈 남자의 차이점 :
-
배고픈 사람은 일단 클래스가로드되면 싱글 톤이 초기화되어 getInstance시 싱글 톤이 이미 존재하는지 확인합니다.
-
게으른 사람들은 게으르고 getInstance가 호출 될 때만이 싱글 톤을 초기화하기 위해 돌아갑니다.
-
배고픈 사람은 본질적으로 스레드로부터 안전하며 문제없이 멀티 스레딩에 직접 사용할 수 있습니다.
-
게으른 스타일 자체는 스레드로부터 안전하지 않습니다. 스레드 안전성을 달성하기 위해 이중 잠금이 있으며,
게으른 싱글 톤
방법 1 : Synchronized () 이중 잠금
class Singleton
{
private static Singleton instance;
private static readonly object syncRoot = new object();//只读
//构造方法private,规避了外界利用new创建此类的可能
private Singleton()
{
}
//此方法是获得本类实例的唯一全局访问点
public static Singleton GetInstance()
{
if (instance == null) //第一次判断是否已创建实例
{
//没有就让一条线程进入并加锁,其它线程等待,等第一条出去以后解锁,然后下一条线程再进入并加锁,直到所有线程处理完毕。
lock (syncRoot)
{
if (instance == null) //二次判断是否已创建实例
{
instance = new Singleton(); //若没有就创建一个
}
}
}
return instance;//否则返回已有的实例
}
}
방법 2 : Synchronized () 메서드
//Synchronized在指定的对象周围创建线程安全(同步)包装,每次执行都要同步
//无论是读和写,都要一个进行完在进行下一个
public static synchronized Singleton getInstance()
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
방법 3 : 정적 클래스 : 아직 이해가 안되므로 여기에 보관하겠습니다.
public class Singleton {
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){
}
public static final Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
배고픈 싱글 톤
클래스가로드되는 즉시 개체를 인스턴스화하여 시스템 리소스를 미리 점유합니다.
//密封类阻止了继承,杜绝继承会增加实例的可能
public sealed class Singleton
{
//在第一次引用类的任何成员时创建实例
private static readonly Singleton instance = new Singleton();
private Singleton()//构造方法私有
{
}
public static Singleton GetInstance()
{
return instance;
}
}