В этой Java-программе есть многопоточные конфликты. как это объяснить?

0
задан Alfred luo 11 April 2019 в 09:40
поделиться

2 ответа

Вы не синхронизируете доступ к переменным в основном потоке.

Вам нужна такая же синхронизация / блокировка переменных, чтобы гарантировать видимость обновлений.

Однако , ваша синхронизация на si, вероятно, не работает так, как вы намеревались, потому что вы продолжаете присваивать этому полю новое значение: вместо этого синхронизируется на test.class.

Аналогично, синхронизация, предоставленная lock, вероятно, не работает так, как вы намереваетесь, потому что каждый экземпляр test имеет свою собственную блокировку.

0
ответ дан Andy Turner 11 April 2019 в 09:40
поделиться

lock не является статическим, поэтому каждый поток использует разные экземпляры, так как вы создаете два экземпляра test, следовательно, ri не синхронизируется. si не синхронизируется, потому что целое число является неизменным, но si++ выполняет распаковку, приращение и упаковку. Вы должны синхронизироваться на другом конечном объекте, который является статическим для ex. или используйте один экземпляр test:

private final Object lockObj = new Object();
...
synchronized(lockObj){
  si++;
}
0
ответ дан igorepst 11 April 2019 в 09:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: