Как правильно инкрементировать числа в потоке?

Только начал изучать потоки и к сожалению еще не совсем разбираюсь в них. Мне в методе test() нельзя использовать synchronaized.

Вопрос: почему не инкрементируются переменные counter и counter2?

Задание: Метод test запускает на выполнение n дочерних потоков, каждый из которых в цикле повторяет k раз следующее:

  • печатает значения счетчиков counter и counter2 через пробел;
  • увеличивает первый счетчик counter на единицу;
  • засыпает на t мсек;
  • увеличивает второй счетчик counter2 на единицу.

Код:

public class Part3 extends Thread {
    private int counter;
    private int counter2;

    private int time;
    private int repeat;
    private int thread;

    private Thread[] threads;

    public Part3(int n, int k, int t) {
        this.thread = n;
        this.repeat = k;
        this.time = t;
        threads = new Thread[n];
    }

    public void test() {
        System.out.println("В тесте........................");
        for (int i = 0; i < thread; i++) {
            threads[i] = new Thread(this);
            System.out.println(counter + "................counter1");
            System.out.println(counter2 + "...............counter2");
            threads[i].start();
        }
    }

    @Override
    public void run() {
        System.out.println("В ране...................");
        for (int i = 0; i < repeat; i++) {
            counter++;
            try {
                Thread.sleep(time);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            counter2++;
        }
    }

    public static void main(String[] args) {
        Part3 p = new Part3(3, 5, 100);
        p.test();
    }
}

Ответы (1 шт):

Автор решения: Barmaley Red Star

Надо использовать специально предусмотренный для таких случаев атомарный класс

public class Part3 extends Thread {
    private AtomicInteger counter=new AtomicInteger(0);

    //blah-blah    
    @Override
    public void run() {
        //blah-blah
        counter.getAndIncrement();
    }
→ Ссылка