단례를 실현하는 세 가지 방식

2485 단어 javaSE 기본

1. 게으름뱅이 모드


1) 해당 클래스에서 자신이 먼저 대상을 만들고 사유화해야 한다.
2) 자신의 구조기를 사유화하여 외부에서 구조기를 통해 새로운 대상을 만드는 것을 방지한다.
3) 자신의 대상을 얻기 위해 공공적인 정적 방법을 외부에 노출하고 싶다.
목적: 특정한 응용 프로그램에서 특정한 클래스가 있고 하나의 실례만 있음을 보증한다(한 클래스는 메모리에 하나의 대상만 존재한다). 즉, 모든 이 유형을 가리키는 실례의 인용은 같은 메모리 공간을 가리킨다. 
 
class ArrayUtil {

   privatestatic ArrayUtilinstance =new ArrayUtil();

 

   private ArrayUtil() {

   }

 

   publicstatic ArrayUtil getInstance(){

      returninstance;

   }

 

   public void doWork() {

      System.out.println("doSomething............");

   }

}

 

public class SingletonDemo {

   publicstatic voidmain(String[] args) {

      // 

      ArrayUtil  instance = ArrayUtil.getInstance();

      // 

      instance.doWork();

   }

}

2.게으름뱅이 모드


1) 굶주린 자 모드와 비슷하게 단계가 수행되지만 객체가 작성될 때까지 단계가 수행되지 않습니다.
2)synchronized는 비static 방법에 대해 동기화 자물쇠는this이다.static 방법에 대해, 우리는 현재 방법이 있는 클래스의 바이트 코드 대상 (Array Util.class) 을 사용합니다.
3)'이중 검사 잠금'메커니즘의 실현은 키워드volatile을 사용합니다. 이것은volatile에 의해 수식된 변수의 값이 로컬 라인에 캐시되지 않는다는 뜻입니다.
이 변수에 대한 읽기와 쓰기는 공유 메모리를 직접 조작해서 여러 라인이 이 변수를 정확하게 처리할 수 있도록 합니다.
 
class ArrayUtil {

   privatestatic volatile ArrayUtil instance =null;

 

   private ArrayUtil() {

 

   }

 

   publicstatic ArrayUtil  getInstance(){

      if (instance == null) {

         // 

         synchronized (ArrayUtil.class) {

            if (instance == null) {

                instance =new ArrayUtil();

                return  instance;

            }

 

         }

      }

      return  instance;

   }

 

   public void doWork() {

 

      System.out.println("doWork............");

   }

}

 

publicclassLazySingletonDemo {

   publicstaticvoid main(String[] args) {

      ArrayUtilinstance =ArrayUtil.getInstance();

      instance.doWork();

   }

}

 

 3.매거 모드 실현


일일이 열거하여 실현하는 것은 절대 안전합니다. 왜냐하면 반사도 대상을 만들 수 없기 때문입니다
도구처럼 보이기 위해서 getInstance () 방법을 써서 매거 대상을 되돌려줍니다.
 
enum  ArrayUtil {

   instance;

   public void doWork() {

      System.out.println("doSomething......");

   }

 

   publicstatic ArrayUtil getInstance(){

      returninstance;

   }

}

 

publicclass EnumSingletonDemo {

   publicstatic void main(String[] args) {

      //ArrayUtil.instance.doWork();

      ArrayUtil   instance = ArrayUtil.getInstance();

      instance.doWork();

 

   }

}

좋은 웹페이지 즐겨찾기