2014-05-23 3 views
4

다음 코드의 메소드 getCopyOf가 Java에서 스레드로부터 안전합니까? 오브젝트의 생성이 원자 적 조작인지 확실하지 않습니다.새로운 객체 스레드를 안전하게 만들 수 있습니까?

public class SomeClass { 
    private final String arg1; 
    private final String arg2; 

    public SomeClass(String arg1, String arg2){ 
     this.arg1= arg1; 
     this.arg2 = arg2; 
    } 

    public SomeClass getCopyOf() { 
     return new SomeClass(this.arg1,this.arg2); 
    } 

    public String getArg1(){ 
     return arg1; 
    } 

    public String getArg2(){ 
     return arg2; 
    } 
} 
+7

'경우'SomeClass' 객체의 복사본을 만들 전혀 필요가 없습니다 - 당신은 전혀'getCopyOf' 방법이 필요하지 않습니다. – Jesper

답변

1

예에서 문자열은 변경 불가능하며 액세스 할 수 없으므로 생성자는 스레드로부터 안전합니다.

그러나 문자열을 임의의 개체 (다른 클래스)로 바꾸고이 개체에 대한 설정자를 지정하면 스레드 안전과 관련된 문제가 발생할 수 있습니다. 따라서 귀하의 질문에 대한보다 일반적인 대답은 없습니다. 다른 방법과 마찬가지로 생성자는 명시 적 스레드 안전 메커니즘을 제공하지 않으므로 작업이 스레드로부터 안전한지 확인해야합니다.

클래스에 정적 필드가있는 경우에도 생성자 자체는 스레드 안전 문제가있을 수 있습니다.

0

까지 까지 스레드 안전입니다. this 참조를 작성자에게 위임해야합니다. 그 후에는 더 이상 스레드로부터 안전하지 않습니다.

public class MyClass { 
    public MyClass(Object someObject) { 
     someObject.someMethod(this); // can be problematic 
    } 
} 

이것은 스레드 안전 문제가 발생할 수있는 몇 가지 시나리오를 상상할 수 있다고 생각하는 한 가지 예입니다.

관련 : SomeClass`는 불변이다 Constructor synchronization in Java

관련 문제