public class Solution {
public static int proposal = 0;
public static void main(String[] args) {
new AcceptProposal().start();
new MakeProposal().start();
}
public static class MakeProposal extends Thread {
@Override
public void run() {
// int thisProposal = proposal;
while (proposal < 10) {
//System.out.println(Solution.proposal);
System.out.println("Сделано предложение №" + (proposal + 1));
proposal++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static class AcceptProposal extends Thread {
@Override
public void run() {
int thisProposal = proposal;
while (thisProposal < 10) {
if (thisProposal != proposal) {
//System.out.println(thisProposal);
//System.out.println(proposal);
System.out.println("Принято предложение №" + proposal);
thisProposal = proposal;
}
}
}
}
}
Почему отрабатывает AcceptProposal если она не видит изменений? Тогда proposal должен остаться равен нулю. Но каким-то образом, она меняет значение и входит в условие if.
Сделано предложение №1
Принято предложение №1
Сделано предложение №2
Сделано предложение №3
Сделано предложение №4
Сделано предложение №5Valeria Li
20 уровень
Почему отрабатывает класс AcceptPropoosal в начале?
Обсуждается
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #598481
28 января 2021, 10:20
Нити могут работать с кешированным значением переменной: одна нить изменила значение, а другая об этом еще не узнала.
Сделай так, чтобы они работали с самой переменной, используй специальное ключевое слово
0
Valeria Li
28 января 2021, 11:57
Я уже решила эту задачу. Вопрос в том, если переменная работает с кешированным значением, то как proposal поменял свое значение?
0
Wladyslaw Java Developer Master
28 января 2021, 14:12полезный
нет гарантии что тред всегда будет работать с кешем и никогда не перечитает основную память. Или что он закеширует значение сразу, а не как-то потом.
+2