Как этот синхронизированный код сломался?

У меня есть следующий фрагмент кода.

synchronized (mObject) { if (mObject.variable != -1) { doThis(); doThisAsWell(); andThis(); insertObjectInDb(); // This is crashing because mObject.variable is -1 } } 

Насколько мне известно, если я использую синхронизацию по объекту, а затем запускаю этот блок, значение переменной не может быть изменено никаким другим потоком, верно? Я не понимаю, как значение переменной равно -1, когда я специально проверяю это до ввода следующего блока. И нет, ни одна из функций в блоке не меняет значение. Неужели я полностью неправильно понял, как работают эти блоки?

Если это вообще имеет значение, все это в методе doInBackground () задачи async в приложении для Android.

Есть идеи?

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

Ваше предположение неверно. synchronized – это монитор. Единственная гарантия, которую вы имеете, это то, что к монитору одновременно обращается один поток.

В этом случае объект «mObject» не блокируется, а объект «mObject» используется как мьютекс, и тело не может одновременно выполняться с другими разделами кода, также синхронизированными в «mObject». Он не влияет на другие поля / методы «mObject», которые не синхронизированы.

Нашли несколько подробностей здесь: блокировка метода синхронизации по объекту или метод? См. Главный комментарий по этому вопросу.

Afaik synchronized просто говорит, что любой доступ к mObject является потокобезопасным, означает, что следующий код будет гарантированно установить i-3, если вызвано в 3 потоках

 int i=0; synchronized(i){ i = i + 1; } 

Вы хотите использовать мьютекс