这段同步代码是如何破解的?

How did this synchronized code break?

我有以下代码片段。

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

据我所知,如果我对一个对象使用 synchronized,然后 运行 该块,变量的值不能被任何其他线程更改,对吗?当我在进入下一个块之前专门检查它时,我不明白变量的值是-1。不,块中的 none 个函数正在更改值。我是否完全误解了这些块的工作原理?

如果这很重要,那么这一切都在 android 应用程序中异步任务的 doInBackground() 方法中。

有什么想法吗?

To my knowledge, if I use synchronized on an object, and then run that block, the value of the variable can't be changed by any other thread, right?

不,你的假设是错误的。 synchronized 是监视器。唯一的保证是监视器在同一时间被一个线程访问。

Afaik synchronized 只是说对 mObject 的任何访问都是线程安全的,这意味着如果在 3 个线程中调用,以下代码将保证将 i 设置为 3

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

您要使用的是互斥锁

在这种情况下,对象 "mObject" 不会被锁定,而是对象 "mObject" 被用作互斥锁,并且主体被阻止与其他同步的代码段同时执行"mObject." 它对未同步的 "mObject" 的其他 fields/methods 没有影响。

在这里找到了一些细节:Java synchronized method lock on object, or method? 请参阅对此的置顶评论。