Мне интересно, почему результат не 400 000. Есть две темы, почему он блокируется?Проблема с потоками Java?
class IntCell {
private int n = 0;
public int getN() {return n;}
public void setN(int n) {this.n = n;}
}
class Count extends Thread {
private static IntCell n = new IntCell();
@Override public void run() {
int temp;
for (int i = 0; i < 200000; i++) {
temp = n.getN();
n.setN(temp + 1);
}
}
public static void main(String[] args) {
Count p = new Count();
Count q = new Count();
p.start();
q.start();
try { p.join(); q.join(); }
catch (InterruptedException e) { }
System.out.println("The value of n is " + n.getN());
}
}
Почему существует проблема с этим?
Что вы подразумеваете под словом «зачем оно блокируется»? Что касается того, что не так - представьте, если оба потока выбрали конкретное значение (скажем, 100), то оба прироста (до 101), а затем сохраните это значение. Два приращения произошли, но результат равен 101 вместо 102 ... –
Возможно, вы захотите добавить полученные результаты. FYI: это фундаментальная вещь, которую вам нужно понимать с помощью потоков и одновременных обновлений значений. –
Я предлагаю вам пойти и прочитать, как работает многопоточность. Ваш вопрос подразумевает серьезное заблуждение. Многопоточность настолько трудно понять, что вам нужно иметь хорошее понимание, прежде чем начать. – davmac