Java, почему с == 2?

273
21 ноября 2017, 21:42
public class VolatileTest {
    static int a = 0;
    static int b = 0;
    static int c = 0;
    public static void main(String[] args) throws InterruptedException {
         new MyThread1().start();
         new MyThread2().start();
         Thread.currentThread().sleep(50);
         System.out.println("c: " + c);

    }
    static  class MyThread1 extends Thread {
        @Override
        public void run() {
            int r1 = a;
            System.out.println("r1: " + r1);
            int v = c;
            v++;
            c = v;
            b = 1;
        }  
    }
    static class MyThread2 extends Thread {
        @Override
        public void run() {
            int r2 = b;
            System.out.println("r2: " + r2);
            int v = c;
            v++;
            c = v;
            a = 1;
        }  
    }   
}

Почему С == 2 после выполнения main и как можно сделать чтобы r1 и r2 всегда были нулями?

Answer 1

Тело треда очень маленькое и первый тред успевает отработать до того, как начнет работать второй. Поэтому, с и равно 2. Если же хочется, что бы все было "более ожидаемо" (я не говорю, что оно будет правильнее и действительно ожидаемие), добавьте sleep между строками с произвольными (полученными у random) значениями.

как можно сделать чтобы r1 и r2 всегда были нулями?

присвоить им явно ноль и не трогать.

READ ALSO
Проигрывание YouTube video без использования YouTube Data API

Проигрывание YouTube video без использования YouTube Data API

Хочу добавить в приложение возможность поиска и просмотра,видео на YouTube без использования YouTube Data API так как там есть ограничения по количеству...

338
VK API user.get - почему некоторые поля пустые?

VK API user.get - почему некоторые поля пустые?

Разбираюсь с vk apiХочу вытащить информацию о пользователе по полям games,education,occupation

313
Разные ветки в GIT с общими классами [дубликат]

Разные ветки в GIT с общими классами [дубликат]

На данный вопрос уже ответили:

272
Конвертирование даты в java

Конвертирование даты в java

ЗдравствуйтеЯ хочу создать объект типа Date и при создании я ему присваиваю значение из строки из коллекции

327