0

나는 1000 개의 스레드를 생성하고 각 스레드는 변수 합에 1을 더하는 프로그램을 만들었습니다. 제 문제는 출력이 1 초 밖에되지 않습니다. 나는 단지 1 초를 얻을 setSumValue 방법을 동기화해도변수 값을 변경하기 위해 1000 개의 스레드 만들기

class Threading implements Runnable{ 

    T6_Q1 sumObject=new T6_Q1(); 

    Thread t; 

    Threading(){ 
     t=new Thread(this); 
     t.start(); 
    } 

    @Override 
    public void run() { 

     setSumValue(); 

     System.out.println(sumObject.getSum()); 
    } 


    public void setSumValue(){ 
     Integer value=sumObject.getSum().intValue()+1; 

     sumObject.setSum(value); 

    } 
} 

public class T6_Q1 
{ 


Integer sum =new Integer(0); 

public void setSum(int value){ 
    this.sum=new Integer(value); 
} 

//method to get the sum value 
public Integer getSum(){ 
    return this.sum; 
} 

public static void main(String[] args) { 

    //launches 1000 threads 
    for(int i=1;i<=1000;i++) 
    { 
    new Threading(); 
    } 

} 
} 

: 여기

는 프로그램입니다. 여기서 내가 뭘 잘못하고 있니? (스레딩에 익숙하지 않으므로 오류를 이해하기가 어렵습니다.)

감사합니다.

답변

7

Threading 개체에는 자체 값이있는 sumObject 인스턴스가 있습니다.
그들은 서로 관계가 없습니다.

코드를 수정하면 코드가 스레드로부터 완전히 안전하다는 것을 알게됩니다.
1,000 개의 다른 개체를 동기화해도 문제가 해결되지 않습니다. 단일 객체를 동기화하면 스레드의 목적이 완전히 상실됩니다.

+0

"패배 목적"부분을 제외한 모든 것에 동의합니다. 이것은 분명히 단지 최소한의 예일 뿐이다.보다 넓은 맥락에서 쓰레드 - 세이프 (thread-safe) 버전이 바람직 할 것이다. –

+0

@MarkoTopolnik : 아니요. 'AtomicInteger'. – SLaks

+0

좋아요, 그건 Java 전문가의 팁입니다.이 예제를 그대로 사용하는 경우에만 작동합니다. 어쩌면 하나의 변수를 돌연변이시키는 것 이상의 작업이있을 수 있습니다. 또한 잠금 장치가 높은 부하 상태에서 CAS보다 실제로 더 효율적이라고 생각하십시오. –

관련 문제