문제

내가 무엇인지 궁금 좋은 방법이있을 것을 주장에 대한 동기화하거나 무언가가도록 감지할 수 있는 동기화를 위반(을 테스트하는 동안).

에 사용할 수 있는 예 경우에는 반하지 않는 스레드에 안전하고 있는 될 수 없는 스레드에 안전합니다.어떤 방법으로 나는 어떤 주장하는 것이 저에게 알려주(로그인 또는 뭔가)는 경우 어떤 방법(s)의 불에서 여러 스레드입니다.

난 그리움에 대한 유사한 무언가가 될 수 있는 대 AWT dispatch 스레드와 함께 다음과 같다:

public static void checkDispatchThread() {
    if(!SwingUtilities.isEventDispatchThread()) {
        throw new RuntimeException("GUI change made outside AWT dispatch thread");
    }
}

나만을 원하는 무언가를 더 일반적이다.문제는 설명되지 않도록 명확한 그러나 난 누군가에는 몇 가지 좋은 방법=)

도움이 되었습니까?

해결책

당신은 성배를 찾고 있다고 생각합니다. Afaik은 존재하지 않으며 Java는 그러한 접근 방식을 쉽게 만들 수있는 언어가 아닙니다.

"실제로 Java 동시성"에는 스레딩 문제 테스트에 관한 섹션이 있습니다. 그것은 얼마나 힘든지에 특별한주의를 기울입니다.

다른 팁

문제가 발생할 경우 통해 스레드에서 Java 그것은 일반적으로 관련된 교착 상태를 감지,그 이상 모니터링하고 스레드에 액세스 동기화 섹션에서 동일한 시간입니다. JMX 확장,추가 JRE 부터 1.5,검색할 수 있습니다 사람들은 교착 상태.사실 우리가 사용하는 JMX 안에 우리의 자신의 소프트웨어를 자동적으로 교착 상태를 검색할 수 있는 추가 그것을 발견되었다.

여기에는 하는 방법에 대한 그것을 사용합니다.

Intellij 아이디어 유용한 동시성이 많이 있습니다 검사. 예를 들어, 동기화되지 않은 컨텍스트에서 동기화되지 않은 컨벤션에서 동일한 객체에 액세스 할 때 경고합니다.

비슷하게, FindBugs 많은 비슷한 점이 있습니다 체크 무늬.

@Fernando의 스레드 교착 상태에 대한 언급뿐만 아니라 여러 스레드의 또 다른 문제는 동시 수정과 그 문제가 발생할 수있는 문제입니다.

Java가 내부적으로하는 한 가지는 컬렉션 클래스가 몇 번이나 업데이트 된 수를 유지한다는 것입니다. 그런 다음 반복자는 모든 .next ()의 값을 반복하는 동안 컬렉션이 업데이트되었는지 확인하기 위해 인터레이터가 만들었을 때의 값을 확인합니다. 나는 그 원리가 더 일반적으로 사용될 수 있다고 생각합니다.

노력하다 대회 또는 은폐

두 도구는 코드를 분석하여 스레드간에 공유 될 수있는 데이터 부분을 파악한 다음 두 스레드가 동시에 일부 데이터를 변경하려고 시도 할 때 중단되는지 확인하기 위해 코드 (컴파일 된 클래스에 추가 바이트 코드 추가)를 계측합니다. . 그런 다음 두 스레드가 계속해서 계속 실행되며, 매번 약간 다른 시간 오프셋으로 시작하여 액세스 패턴의 가능한 많은 조합을 얻을 수 있습니다.

또한이 질문을 확인하십시오. 단위 멀티 스레드 애플리케이션 테스트?

Peter Veentjer가 Bloged에 대한 접근 방식에 관심이있을 수 있습니다. 동시성 탐지기. 나는 그가 아직 이것을 오픈 소싱했다고 생각하지는 않지만, 그가 설명 하듯이 기본 아이디어는 프로파일 링에 관심이있는 AOP에서 기기 코드를 사용하고 어떤 스레드가 어떤 필드에 닿았는지 기록하는 것입니다. 그 후 그것은 생성 된 로그를 수동으로 또는 자동으로 구문 분석하는 문제입니다.

스레드 안전하지 않은 클래스를 식별 할 수 있다면 정적 분석에서 "탈출"이 여러 스레드에 보일지 여부를 알려줄 수 있습니다. 일반적으로 프로그래머는 머리 속 에서이 작업을 수행하지만 분명히 이와 관련하여 실수가 발생하기 쉽습니다. 도구는 비슷한 접근 방식을 사용할 수 있어야합니다.

즉, 당신이 설명하는 유스 케이스에서, 그것은 스레드를 기억하고 주장을하는 것만 큼 간단한 것처럼 들립니다.

class Foo {

  private final Thread owner = Thread.currentThread();

  void x() {
    assert Thread.currentThread() == owner;
    /* Implement method. */
  }

}

어설 션이 비활성화 된 경우에도 소유자 참조는 여전히 채워져 있으므로 전적으로 "무료"가 아닙니다. 또한이 상용구로 많은 수업을 혼란스럽게하고 싶지 않습니다.

그만큼 thread.holdslock (개체) 방법은 또한 귀하에게 유용 할 수 있습니다.

당신이 제공하는 특정 예제의 경우, swinglabs에는 이벤트 스레드 위반을 감지하고 교수형을 줄 수있는 일부 도우미 코드가 있습니다. https://swinghelper.dev.java.net/

얼마 전, 나는 Jprobe Java 프로파일 링 도구와 함께 일했습니다. 그들의 도구 중 하나 (Threadalyzer?)는 스레드 동기화 위반을 찾았습니다. 그들의 웹 페이지를 보면, 나는 그 이름의 도구 나 내가 기억하는 것을 보지 못합니다. 그러나 당신은 살펴보고 싶을 수도 있습니다. http://www.quest.com/jprobe/performance-home.aspx

당신이 사용할 수있는 Netbeans Profiler 또는 jconsole 스레드 상태를 깊이 확인합니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top