我有以下代码段。
synchronized (mObject) {
if (mObject.variable != -1) {
doThis();
doThisAsWell();
andThis();
insertObjectInDb(); // This is crashing because mObject.variable is -1
}
}
据我所知,如果我在对象上使用synchronized,然后运行该块,则变量的值不能被任何其他线程更改,对吧?当我在进入下一个块之前专门检查变量的值时,我不明白变量的值是-1。不,该块中的所有功能都没有改变该值。我是否完全误解了这些块是如何工作的?
如果它很重要,这就是Android应用程序中异步任务的doInBackground()方法。
有什么想法吗?
答案 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;
}
您要使用的是互斥锁