Я пытаюсь изучить концепцию взаимодействия потоков в java и выработал следующий код. Я заметил, что когда я запускаю код с System.out.println("from t1: " + c1.value());
и System.out.println("from t2: " + c1.value());
, распечатанным результатом будет всегда равен 20000.результат приращения переменной int изменяется из-за наличия или отсутствия операторов System.out.println()
Однако, когда я запускаю код без System.out.println()
заявления, результат всегда будет 10000 < < результата 20000 . Почему это происходит?
public class Counter {
public static void main(String[] args) throws InterruptedException {
Counter c1 = new Counter();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
c1.increment();
System.out.println("from t1: " + c1.value());
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
c1.increment();
System.out.println("from t2: " + c1.value());
}
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(c1.value());
}
private int c = 0;
public void increment() {
c++;
}
public void decrement() {
c--;
}
public int value() {
return c;
}
}
В прошлом я заметил, что добавление оператора System.out.print в код может значительно замедлить код, если он находится в цикле/рекурсии. Поэтому я предполагаю, что, поскольку оператор печати замедляет выполнение, оба потока имеют время для выполнения всех приращений без вмешательства, и без println() не все регистры увеличиваются, поэтому вы получаете меньше 20000. Не уверен хоть. – Maljam