0

Я создал программу, которая создает 1000 потоков, и каждый поток добавляет 1 к переменной сумме. Моя проблема заключается в том, что я получаю только 1 сек.Создание 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(); 
    } 

} 
} 

Даже если я синхронизирован метод setSumValue я только получить 1s. Что я здесь делаю неправильно? (Новым для нарезки, так что все еще бит трудно понять ошибки)

Спасибо за ваше время.

ответ

7

Каждый из ваших объектов Threading имеет свой собственный экземпляр sumObject с его собственным значением.
Они не имеют ничего общего с друг друга.

Как только вы исправите это, вы обнаружите, что ваш код полностью не потокобезопасен.
Синхронизация на 1000 различных объектах не будет исправлять это вообще; синхронизация на одном объекте полностью уничтожит цель потоков.

+0

Я согласен со всем, кроме части «поражения цели». Это, очевидно, всего лишь минимальный пример, в более широком контексте потокобезопасная версия имела бы смысл. –

+0

@MarkoTopolnik: Нет; 'AtomicInteger'. – SLaks

+0

Хорошо, это совет Java pro, и работает только тогда, когда этот пример взят буквально. Возможно, есть больше работы, чем просто мутация одной переменной. Также учтите, что блокировки на самом деле более эффективны, чем CAS при высокой нагрузке. –