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 всегда были нулями?
Тело треда очень маленькое и первый тред успевает отработать до того, как начнет работать второй. Поэтому, с и равно 2. Если же хочется, что бы все было "более ожидаемо" (я не говорю, что оно будет правильнее и действительно ожидаемие), добавьте sleep между строками с произвольными (полученными у random) значениями.
как можно сделать чтобы r1 и r2 всегда были нулями?
присвоить им явно ноль и не трогать.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости