2014-07-05 3 views
2

"MyClass"라는 클래스 내에 정적 "Builder"클래스가 있습니다. 두 스레드에서 빌더를 동시에 사용하여 MyClass의 인스턴스 두 개를 만들려고해도 안전할까요? 한 스레드가 설정 한 값을 다른 스레드가 만든 객체에 할당 할 수 있습니까? 정적 중첩 클래스 스레드 안전성 -

코드

:

public class MyClass { 
    private int height; 
    private int weight; 

    private MyClass(Builder builder) { 
     height = builder.height; 
     weight = builder.weight; 
    } 

    public static class Builder { 
     private int height; 
     private int weight; 

     public Builder height(int h) { 
      height = h; 
      return this; 
     } 

     public Builder weight(int w) { 
      weight = w; 
      return this; 
     } 

     public MyClass build() { 
      return new MyClass(this); 
     } 

    } 
} 
+0

왜 위험하다고 생각합니까? –

+0

Hello shadow, 빌더를 어떻게 사용 하시겠습니까? (예제 코드를 알려주십시오)? –

+1

정적 내부 클래스는 싱글 톤의 형식이라는 의미에서 정적은 아니며 기본적으로 최상위 클래스를 의미하며 내부 클래스의 메서드와 필드에 암묵적으로 액세스 할 수 없습니다. –

답변

8

나는 두 개의 스레드에서 동시에 빌더를 사용하여 MyClass에 두 개의 인스턴스를 만들려고하면, 그것은 안전 할 것인가? 당신이 두 스레드에 Builder같은 인스턴스를 사용하는 것을 의미하는 경우 각 스레드가 Builder의 자체 인스턴스가있는 경우

후 아니,하지만 당신은 괜찮을거야. 이러한 유형의 패턴은 다음과 같습니다.

Builder 인스턴스는 단일 스레드에 로컬입니다.

0

답변을 얻었습니다. 물론 그것에 추가하는 것은 물론 빌더는 스레드로부터 안전하지 않습니다. 현재 코드 모양에서 다음과 같이 변경하면 문제가 발생할 수 있습니다.

public static class Builder { 
    private volatile int height; 
    private volatile int weight; 
+0

그는 다른 스레드 스택에 두 개의 인스턴스가 필요하므로 그 상황에서 휘발성이 필요하지 않습니다. –

+0

아니요, 두 인스턴스가 동일한 빌더 인스턴스에서 작성된 경우 필요합니다. 나는 그것이 문제라고 생각했다. 그렇지 않다면 스레드 안전성에 대해서도 말하지 않았다. – ac3

+1

"두 인스턴스가 같은 빌더 인스턴스에서 생성되면"아니오 - 이것은 말도 안되며, 휘발성은 두 개의 스레드 인스턴스를 공유하려고하는 경우, 자신의 경우에는 실 거예요. 그는 정적 인 내부 클래스가 빌더를 싱글 톤으로 만들 것이라는 점에서 정적이라고 생각했습니다. –