2010-06-01 5 views

답변

5

생성자 자체가 스레드로부터 안전하다고 가정하면 좋습니다.

Entity의 기본 자동 생성 된 생성자를 부르고있다하더라도 그것은 ... 매우 스레드 안전을 위해 생성자 하지에 대한 통상적이지 않지만 가능한 것, 기본 생성자 스레드 안전하지 않을 수 있습니다 . 난 그냥 가능, 그것은 가능성이 높습니다 말하는 게 아니에요 :)

은 기본적으로 정적 메서드 또는 인스턴스 메소드 또는 생성자에 적용되는 마법의 스레드 안전성 없습니다. 동기화가 적용되지 않으면 여러 스레드에서 동시에 호출 될 수 있습니다. 공유 데이터를 가져 오거나 변경하지 않으면 일반적으로 안전합니다. 을 수행하면 공유 데이터에 액세스 할 때 조심해야합니다. (공유 데이터가 변경되지 않거나 읽기 전용 인 경우 일반적으로 괜찮습니다.하지만 스레드 중 하나가 변경하려고하면 실제로주의해야합니다.)

정적 초기화 자 (정적 변수 및 static { ... } 블록에 대한 초기화 표현식 클래스 내에서 직접적으로) 특별한 처리가 있습니다. VM은 유형이 초기화 될 때까지 기다리는 다른 스레드를 차단하여 한 번만 실행되도록합니다.

+0

'공유 데이터'란 무엇을 의미 할 수 있습니까? 나는 이것이'Enity' 클래스의 정적 필드 일 것이라고 생각합니다! – Akshat

+0

@Akshat : 여러 스레드가 액세스하고 수정 한 모든 데이터를 의미합니다. –

+0

이 예제에서, 생성자가 일부 원시적이 아닌 원시 필드를 초기화하고 다른 것을 초기화하지 않으면 스레드 안전을 위해'getInstance()'메서드를 동기화해야합니까? – Akshat

4

이것은 Entity 생성자의 세부 사항에 달려 있습니다. Entity 생성자가 공유 데이터를 수정하면 그렇지 않습니다.

0

여러 스레드가이 메서드를 호출 할 수 있으며 각 스레드는 '엔터티'의 고유 한 인스턴스를 가져옵니다. 따라서이 방법은 '본질적으로'스레드로부터 안전합니다. 그러나 생성자 또는 스레드 생성기 중 하나에 슈퍼 스레드 생성자에 코드가있는 경우 안전 문제가 발생할 수 있습니다.

1

스레드 안전성은 다른 스레드 간의 공유 데이터에 대한 액세스입니다. 예제의 코드는 자체적으로 공유 데이터에 액세스하지 않지만 스레드 안전 여부는 생성자가 다른 스레드간에 공유 될 수있는 데이터에 액세스하는지 여부에 따라 다릅니다.

동시 프로그래밍과 관련하여 많은 미묘하고 까다로운 문제가 있습니다. Java에서 쓰레드 안전성과 동시 프로그래밍에 대해 배우고 싶다면 Brian Goetz가 책 Java Concurrency in Practice을 적극 추천합니다.

2

아마 스레드로부터 안전 할 수 있지만 그 요점은 무엇입니까? 팩토리 메서드를 사용하여 기본 생성자로 리디렉션하는 경우 먼저 생성자를 사용하지 않는 이유는 무엇입니까? 그래서 질문은 : 당신은 무엇을 성취하려고합니까? getInstance()이라는 이름은 싱글 톤을 제안하지만 적어도 공통점은 있습니다.하지만 그곳에는 싱글 톤이 없습니다.

public class Singleton { 

     private Singleton() { 
     } 

     public static Singleton getInstance() { 
      return InstanceHolder.INSTANCE; 
     } 

     private static final class InstanceHolder { 

      public static final Singleton INSTANCE = new Singleton(); 

     } 
    } 

을하지만 그렇게하지 않으면 당신이 어떤 값 (메소드 이름의 의미를 추가하지 않는으로, 왜, 이러한 팩토리 메소드 신경 : 당신이 싱글을하고자 할 경우, 다음과 같은 정적 내부 홀더 클래스를 사용 , 객체 풀링, 동기화 등)