2014-05-21 3 views
0

중첩 클래스를 실행하는 여러 스레드에서 전용 String 필드에 액세스하고 있습니다.Java : String 객체의 스레드 안전

String 객체는 변경할 수 없으므로 String을 인수로 전달하는 것이 항상 안전해야한다는 것을 알고 있습니다. 하지만 똑같은 필드에 액세스하는 것은 어떨까요? 스레드 안전하지 않은 것으로 가정합니까?

답변

1

필드로만 액세스하기 때문에 여전히 스레드로부터 안전합니다. 문제는 다른 스레드가이 변수의 값을 동시에 얻는 동안 일부 스레드가 필드 (상태 또는 전체 개체 참조를 변경)를 수정하려고하는 경우입니다.

일반적으로, 당신은 필요한 인수를 Runnable를 구현하는 클래스를 생성하고 전달할 :이뿐만 아니라 인수의 다른 종류의 적용 할 수

class MyTask implements Runnable { 
    private final String needThis; 
    public MyTask(String needThis) { 
     this.needThis = needThis; 
    } 
    @Override 
    public void run() { 
     //do your task using needThis variable here... 
    } 
} 

. 또한 스레드의 데이터로 불변 클래스의 객체 참조 (예 : String)를 보내는 것이 좋습니다.

+0

좋아, 물론입니다. 하지만 가능한 미래 조정 코드를 위반하지 않는 방식으로 코드를 작성하고 싶습니다. :) 그래서 (Runnable의) 생성자에 String을 전달하는 것이 더 좋은 방법일까요?! – user3541377

+0

@ user3541377 예. –

+0

stringbuffer를 사용하십시오 –

2

필드를 읽는 중이라면 항상 스레드로부터 안전합니다. 값을 변경하는 경우 컴파일러가 확인하도록 필드를 final로 만드시겠습니까?

private final String theField = "TheValue" 
+0

또 다른 좋은 방법이긴하지만, 제 경우에는 문자열이 동적으로 설정되어 다른 방법으로 갈 것입니다. – user3541377