Почему i++ не атомарный?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему i++ не атомарный?

Сообщение Anonymous »

Почему i++ не является атомарным в Java?
Чтобы углубиться в Java, я попытался подсчитать, как часто выполняется цикл в потоках.
Поэтому я использовал
private static int total = 0;

в основном классе.
У меня есть два потока.
  • Поток 1: печатает System.out.println("Привет из потока 1!");
  • Поток 2: печатает System.out.println("Привет из потока 2! ");
И я считаю строки, напечатанные потоком 1 и потоком 2. Но строки потока 1 + строки потока 2 не совпадают с общим количеством распечатанных строк.
Вот мой код:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Test {

private static int total = 0;
private static int countT1 = 0;
private static int countT2 = 0;
private boolean run = true;

public Test() {
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
newCachedThreadPool.execute(t1);
newCachedThreadPool.execute(t2);
try {
Thread.sleep(1000);
}
catch (InterruptedException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
run = false;
try {
Thread.sleep(1000);
}
catch (InterruptedException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println((countT1 + countT2 + " == " + total));
}

private Runnable t1 = new Runnable() {
@Override
public void run() {
while (run) {
total++;
countT1++;
System.out.println("Hello #" + countT1 + " from Thread 1! Total hello: " + total);
}
}
};

private Runnable t2 = new Runnable() {
@Override
public void run() {
while (run) {
total++;
countT2++;
System.out.println("Hello #" + countT2 + " from Thread 2! Total hello: " + total);
}
}
};

public static void main(String[] args) {
new Test();
}
}


Подробнее здесь: https://stackoverflow.com/questions/251 ... not-atomic
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»