2013-02-25 2 views
3

나는 Threads를 처음 사용합니다. 나는 Java Concurrency in Practice를 읽고있다. 나는이 책에서 다음 예를 발견했다. 비 스레드 안전 클래스를 테스트하는 방법은 무엇입니까?

@NotThreadSafe 
public class UnSafeSequence 
{ 
    private int value; 
    public int getNext() 
    { 
     return value++; 
    } 
} 

나는 스레드 안전의 느낌을 얻기 위해이 클래스에 접근 (또는 그 이상) 스레드의 부부를 작성하여이 코드를 테스트하고 싶었다.

나는 이런 식으로 시도했지만 실제로 이러한 예제를 테스트하는 방법을 모르겠다.

class MyThread implemented Runnable 
{ 
    public void run() 
    { 
     //Should I create a new object for UnSafeSequence here ? 
    } 
} 

도움 주셔서 감사합니다.

+2

문제에 귀하의 스레드에 전달 : 당신은 두 가지 옵션이 있습니다 비 스레드 세이프 코드의 경우 코드가 n 번 실행될 수 있으며 올바른 결과를 n 번 생성 할 수 있습니다. –

답변

5

각 스레드의 인스턴스가 UnSafeSequence 인 경우 문제를 설명하지 않습니다. 당신이해야 할 일은 MyThread 인스턴스 외부에 UnSafeSequence의 인스턴스를 생성하고 각각 MyThread의 생성자로 전달하는 것입니다.

스레드에 대해 배우는 동안 ExecutorService 및 기타 훌륭한 클래스에 대해 읽어보십시오. 여기에 good tutorial from Sun^H^H^H Oracle이 있습니다.

0

스레드 당 하나의 UnSafeSequence 인스턴스를 만들 수 있습니다. 이는 완전히 안전합니다. N 개의 스레드에 대해 그렇게하면 값의 N 사본을 가지게됩니다.이 값은 문제의 비동기 데이터입니다.

안전하지 않은 방식으로 스레드에 액세스하려면 UnSafeSequence이라는 단일 인스턴스를 만든 다음 다중 스레드에서 getNext()를 호출해야합니다.

2

아니요, UnSafeSequence의 새 인스턴스를 run에 만들면 각 스레드마다 자체 value 구성원이 있으며 문제가 표시되지 않습니다.

  • valuegetNext() 정적 확인하고 UnSafeSequence.getNext()

  • 로 전화를 공유 객체를 생성하고 생성

    class MyThread implemented Runnable 
    { 
        UnSafeSequence unsafe; 
        MyThread(UnSafeSequence unsafe) { this.unsafe = unsafe; } 
        public void run() { /* call unsafe.getNext(); */ } 
    } 
    
관련 문제