Вы не синхронизируете доступ к переменным в основном потоке.
Вам нужна такая же синхронизация / блокировка переменных, чтобы гарантировать видимость обновлений.
Однако , ваша синхронизация на si
, вероятно, не работает так, как вы намеревались, потому что вы продолжаете присваивать этому полю новое значение: вместо этого синхронизируется на test.class
.
Аналогично, синхронизация, предоставленная lock
, вероятно, не работает так, как вы намереваетесь, потому что каждый экземпляр test
имеет свою собственную блокировку.
lock
не является статическим, поэтому каждый поток использует разные экземпляры, так как вы создаете два экземпляра test
, следовательно, ri
не синхронизируется. si
не синхронизируется, потому что целое число является неизменным, но si++
выполняет распаковку, приращение и упаковку. Вы должны синхронизироваться на другом конечном объекте, который является статическим для ex. или используйте один экземпляр test
:
private final Object lockObj = new Object();
...
synchronized(lockObj){
si++;
}