Просто пообщайтесь с многопоточным чтением, чтобы узнать больше об этом в отношении ключевого слова и других аспектов synchronized
. Я написал простой класс и основной класс для вызова методов этого класса в разных потоках. Я видел то, что ожидал несколько раз (значения менялись на 2 вместо 1), но затем наткнулся на более крупный прыжок, который я не могу понять - кто-нибудь знает, как это произошло?Повсеместное многопоточное поведение (Java)
Вот мой код:
public class SeatCounter {
private int count = 0;
public int getSeatCount() {
return count;
}
public void bookSeat() {
count++;
}
public void unBookSeat() {
count--;
}
}
и
public class Main {
public static void main(String args[]) {
final SeatCounter c = new SeatCounter();
Thread t1 = new Thread() {
public void run() {
while(true) {
c.bookSeat();
System.out.println(c.getSeatCount());
}
}
};
Thread t2 = new Thread() {
public void run() {
while(true) {
c.unBookSeat();
System.out.println(c.getSeatCount());
}
}
};
t1.start();
t2.start();
}
}
, и я получил это в какой-то момент в моей консоли:
-16066
-16067
-16068
-16069
-16031
-16069
-16068
-16067
-16066
EDIT: Спасибо за быстрые ответы, я знаю об использовании синхронизации, я просто играл, чтобы понять, что пошло не так, что я не понимаю, как это изменилось (от -16069 до -16031) одним прыжком, так как оператор распечатки должен произойти с каждым изменением сохраненного значения и с двумя потоками без синхронизации, я бы предположил, что это будет означать не более 2 в значении.
Вы не используете * синхронизацию *. Таким образом, * странный * результат равен *, как ожидалось * в соответствии с Java Memory Model – TheLostMind
Вы действительно не должны иметь никаких ожиданий относительно результата этого вычисления - каждый поток может выполняться в течение произвольного промежутка времени. Один поток, выполняющий 16 000 дополнительных декрементов, чем приращения в другом потоке, действительно не является неожиданным с учетом скорости процессоров и изменения времени выполнения среди потоков. – Oli
Хорошо, должен был упомянуть - я знаю о синхронизированном ключевом слове, я просто рассматривал проблемы, не используя его. Я ожидал, что скачки 2 или 0 могут произойти, это большой прыжок, который меня смущает, так как не более 2 изменений должны произойти со значением до появления заявления печати. Кроме того, это было взято из небольшого количества времени, и я не ожидал, что он сидит около 0. –