4

TestNG를 사용하여 테스트를 병렬로 실행하고 도우미 클래스 및 유틸리티와의 동기화 문제를 조심하고 싶습니다. 필자가 아는 한, 각 테스트는 테스트 러너가 투명하게 만든 자체 객체입니다. 따라서 스레드에서 생성 된 객체이므로 다른 객체에서 볼 수 없기 때문에 비 정적 인 객체를 동기화하는 것에 대해 걱정할 필요가 없습니다.동기화 된 메소드 여야합니까?

그러나 내가 작성한이 외부 로그 기능을 호출 할 때 동기화해야합니까? thread-1이 들어가서 threadName = "Thread-1"을 설정 한 다음 thread-2가 들어 와서 같은 threadName 변수 = "Thread-2"를 설정 한 다음 thread-1이 다시 선택하여 인쇄하는 가능한 경쟁 조건이 있습니까? "--foo | Thread-2"? 이 방법을 동기화 된 방식으로 만들어야합니까?

public static void log(String _message) { 
    String threadName = Thread.currentThread().getName(); 
    log.println("--" + _message + " | Thread: " + threadName); 
} 

답변

4

당신의 변수 threadName지역 변수입니다. 각 스레드에 대해 하나의 인스턴스 이 존재합니다.보다 정확하게 말하자면, 모든 함수 호출에 대해 하나의 인스턴스가 존재할 것입니다. 이는 이 아닌이 서로 영향을 미칠 수 있음을 의미합니다.

+0

좋아요! 내가 생각한 것, 즉 LTINGNING (문자 그대로 10 초 이하) 빠른 응답에 감사드립니다. 비 정적 방법을 동기화하는 것에 대해 걱정할 필요가 없다는 제 가정은 맞습니까? 사실, 정적 멤버 변수 만 걱정할 필요가 있습니까? – dhackner

+0

비 정적 메서드도 공유 데이터에 액세스 할 수 있으므로 항상 모니터를 사용하는 것이 좋습니다. 모니터는 패시브 클래스이며, 변수를 보관하는 용도로만 사용됩니다. 모니터가 수행해야하는 중요한 속성 중 하나는 스레드로부터 안전해야합니다. 나는 자바에서 이것을 달성하기 위해서만 세마포어를 사용했지만 동기화 된 메소드는 같은 방식으로 작동한다. :) –

+1

이것은'log.println()'이 쓰레드에 안전하다고 가정합니다. –

1

Marcus가 위에서 말한 것을 강조하십시오.이 로그 필드는 무엇입니까? 스레드가 안전한지 확인하십시오. 그렇지 않으면 로그 메시지가 겹쳐서 보입니다.