2017-05-11 4 views
2

저는 디자인 패턴을 배우고 있으며 자바에서 중간 경험을 쌓았습니다. 나는 단일 디자인 패턴을 구현하려고하고있어 방법에 다음 코드를 가로 질러 온 :싱글 톤 디자인 패턴에서 동기화 (MyClass.class) {} 무엇을합니까?

public static Singleton getInstance(){ 

    if(firstInstance == null){ 
     if (firstThread){ 
      firstThread = false; 
      Thread.currentThread(); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(Singleton.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
     synchronized(Singleton.class){ 

      if(firstInstance == null){ 
       firstInstance = new Singleton(); 
      } 

     } 


    } 

    return firstInstance; 
} 

내가 이해하는 방법이 어떻게 작동하는지,하지만 난이 코드의 하나 개의 특정 부분 질문이 있습니다 :

 synchronized(Singleton.class){ 

      if(firstInstance == null){ 
       firstInstance = new Singleton(); 
      } 
     } 

나는 구현 스레드 안전을하게하고 코드의이 부분 동기화 할 수있는 동기화 된 블록의 힘이 모든 방법을 진정되지 않는 것을 알지만, 왜 우리는 전에 괄호 안의 Singleton.class 포장된다 액세스 한정자 synchronized?

제 질문은 디자인 패턴과 관련된 것보다 Java 관련입니다. Google과 StackOverflow를 검색해 보았지만이 결과가 실제로 무엇으로 제한되는지는 잘 모르겠습니다.

여러분이 도와 주시면 감사하겠습니다.

미리 감사드립니다.

+1

[이중 확인 잠금] (https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java)이라고합니다. – Radiodef

+0

Google에서 이중 잠금을 사용했습니다. 즉, 동기화 된 코드 만 잠글 수 있으며 다른 액세스 수정 자에 동일한 아이디어를 적용 할 수 있습니까?예 : private (this) {/ * private code here * /} 코드 블록을 메소드 내에서 private으로 처리 할 수 ​​있습니까? – holasoyeddy

+0

아니요, 'synchronized'는 여러 스레드가 동일한 블록을 동시에 실행하지 못하도록하는 키워드입니다. 이중 검사 잠금에서는 단일 인스턴스가 한 번만 생성되도록합니다. 인스턴스가 생성 된 후 잠시 후에 스레드는 첫 번째 널 (null) 검사에서 인스턴스를 보게되고'synchronized' 블록을 입력 할 필요가 없기 때문에 이중 검사됩니다. 이 자료에 대해 배우고 싶다면 튜토리얼을 추천합니다. https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html – Radiodef

답변

1

Java에서 동기화 할 정상적인 작업은 this (예 : 현재 인스턴스)이기 때문입니다. 그러나이 방법은 static이므로 인스턴스가 없으며 단지 클래스입니다. 따라서 우리는 그것을 동기화합니다.

synchronizing의이 부분은 두 스레드가 한 번에 두 인스턴스를 생성하지 않기 때문입니다. 두 사람이 동시에 firstInstance == null 검사를 수행하고 두 검사가 모두 true 인 경우 모두 새 인스턴스를 작성하기로 결정할 때이 문제가 발생할 수 있습니다. 이것은 우리에게 두 번째 인스턴스 인 Singleton 클래스를 제공합니다. 이는 매우 나쁜 것입니다.

synchronizedaccess modifier으로 전화하면 혼란 스러울 것입니다.

유일한 액세스 수정자는 private, publicprotected (숨겨진 기본값과 함께)입니다.

Synchronizednon-access modifier입니다. 단일 메서드는 public static 또는 private synchronized과 같은 액세스 및 비 액세스 수정자를 모두 가질 수 있습니다.

synchronizedstatic 만 블록을 가질 수 있습니다. 그러나 이는 수정 자 분류보다는 사용되는 이유 때문입니다.

1

firstInstance 변수는 해당 클래스의 유일한 개체를 포함하는 Singleton 클래스의 정적 변수입니다.

클래스에서 동기화하면 두 개의 서로 다른 스레드가 동시에 firstInstance 개체를 만들지 않도록 할 수 있습니다. 이렇게하면 firstInstance 변수가 한 번만 초기화됩니다.

+0

그래서, 내가 같이, 다른 액세스 수식과이를 반복 할 수있을 것입니다 의미 하는가 개인적인 방법으로 취급 되는가? – holasoyeddy

+1

@holasoyeddy'synchronized'는'Object' (잠금)에서 작동하는 특별한 키워드입니다. 'private'은 잠금을 필요로하지 않기 때문에 아무 것도 작동하지 않습니다. 또한'private' 블럭을 가질 수없고'static'과'synchronized' 만 사용할 수 있습니다. – River

+0

그게 내가 알고 싶었던거야. 고마워, 얘들 아! :) – holasoyeddy