public class Synch {
private int counter;
public static void main(String[] args) {
Synch s = new Synch();
s.doWork();
}
public void doWork() {
Thread th = new Thread(() -> {
for (int i = 0; i < 10000; i++)
counter++;
});
Thread th1 = new Thread(() -> {
for (int i = 0; i < 10000; i++)
counter++;
});
th.start();
th1.start();
System.out.println(counter);
}
}
CilitBang
25 уровень
Почему выводится 0?
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ksenia Volkova Java Developer в DXC Master
16 мая 2020, 10:34решение
Нити не успевают отработать.
Попробуй перед выводом в консоль добавить
+2
CilitBang QA в КЕФИР!
16 мая 2020, 11:01
Попробую. Можно еще сразу несколько вопросов?
1. В чем принципиальное различие скрин ? Тот, что на скрине, выводит измененное значение.
2. Правильно ли я понял, что сначала всегда будет вывод, который вне метода run(), т.к. это системный поток? Просто недавно я общался с Алишевым и он мне сказал следующее:
главного потока нет никакого приоритета по выводу на экран. Все потоки имеют равный доступ к System.out.
0
CilitBang QA в КЕФИР!
16 мая 2020, 11:15
Ты была права, закинуть поток в сон помогло. Я кину решение, но надеюсь, что ты ответишь на два последних вопроса.
0
Ksenia Volkova Java Developer в DXC Master
16 мая 2020, 11:16
1. У меня и вариант с анонимными классами чаще всего выводит 0.
Думаю, тут может играть роль с одной стороны железо, а с другой - как jvm внутри себя работает с лямбдами и анонимными классами. Но это уже глубоко внутрь лезть надо.
2. Думаю, он прав.
+1
CilitBang QA в КЕФИР!
16 мая 2020, 11:18
Может ли такое происходить(код со скрина), если процессор одноядерный?
0