这个同步代码怎么破坏了?

时间:2015-02-12 12:17:45

标签: java android android-asynctask synchronized

我有以下代码段。

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

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

如果它很重要,这就是Android应用程序中异步任务的doInBackground()方法。

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

  

据我所知,如果我在对象上使用synchronized,然后运行它   阻止,变量的值不能被任何其他线程更改,   正确?

不,你的假设是错误的。 synchronized是监视器。您唯一的保证是,一个线程可以访问监视器。

答案 1 :(得分:1)

在这种情况下,对象“mObject”不会被锁定,而是将对象“mObject”用作互斥锁,并且防止正文与同时在“mObject”上同步的其他代码段同时执行。它对未同步的“mObject”的其他字段/方法没有影响。

在此处找到一些详细信息:Java synchronized method lock on object, or method? 请参阅上面的评论。

答案 2 :(得分:0)

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

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

您要使用的是互斥锁