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);
}
좋아요! 내가 생각한 것, 즉 LTINGNING (문자 그대로 10 초 이하) 빠른 응답에 감사드립니다. 비 정적 방법을 동기화하는 것에 대해 걱정할 필요가 없다는 제 가정은 맞습니까? 사실, 정적 멤버 변수 만 걱정할 필요가 있습니까? – dhackner
비 정적 메서드도 공유 데이터에 액세스 할 수 있으므로 항상 모니터를 사용하는 것이 좋습니다. 모니터는 패시브 클래스이며, 변수를 보관하는 용도로만 사용됩니다. 모니터가 수행해야하는 중요한 속성 중 하나는 스레드로부터 안전해야합니다. 나는 자바에서 이것을 달성하기 위해서만 세마포어를 사용했지만 동기화 된 메소드는 같은 방식으로 작동한다. :) –
이것은'log.println()'이 쓰레드에 안전하다고 가정합니다. –