Почему выводит не правильно поток счётчик?
Подскажите как настроить поток так что б counter выводил следующее: 0123456 а counter2 работал хаотично. Нельзя использовать synchronized.
В моём же случае оно инкрементрует сразу на 2-е еденицы, а нужно на 1-ну. Буду всем благодарен за помощь и совет!!!
Класс счётчика:
class Counter {
private int counter = 0;
private int counter2 = 0;
Part3 part3;
Counter(Part3 part3) {
this.part3 = part3;
}
public void testSync() {
System.out.println(counter + " " + counter2);
}
public void letsGO() {
for (int i = 0; i < part3.k; i++) {
test();
incrementOne();
try {
Thread.sleep(part3.t);
} catch (InterruptedException e) {
e.printStackTrace();
}
incrementTwo();
}
}
public void incrementOne() {
counter++;
}
public void incrementTwo() {
counter2++;
}
}
Класс MyThread:
class MyThread extends Thread {
Counter counter;
MyThread(Counter counter) {
this.counter = counter;
}
@Override
public void run() {
counter.letsGO();
}
}
Класс Part3 - класс вызова потока:
public class Part3 {
volatile int k;
volatile int t;
volatile int n;
Part3(int n, int k, int t) {
this.k = k;
this.t = t;
this.n = n;
}
public static void main(String[] args) throws InterruptedException {
Part3 part3 = new Part3(2, 3, 100);
Counter counter = new Counter(part3);
Thread[] thread = new Thread[part3.n];
for (int i = 0; i < thread.length; i++) {
thread[i] = new MyThread(counter);
thread[i].start();
}
}
}
Ответы (1 шт):
Вопрос не вполне корректный, так как непонятно, нельзя ли использовать synchronized вообще, или только в методе инкремента. Можно ли использовать потокобезопасные переменные(AtomicInteger вместо int) и так далее.
Пока что я просто обозначу тебе проблему - она в методе testSync(). Естественно, он не потокобезопасен, и печаетет результат как попало. Если ты пометишь его словом synchronized, то получишь то, что нужно.