【发布时间】:2013-02-24 09:11:54
【问题描述】:
我尝试搜索这个问题,但没有找到任何东西,好像我是唯一一个尝试过的人。
基本上我有一个静态对象,用于在包含类的构造函数中同步资源访问,但我不时注意到它不起作用!
private static Integer lock = Integer.valueOf(0);
public testClass(Context ctx)
{
if (ctx != null)
context = ctx.getApplicationContext();
else
context = null;
synchronized(lock)
{
Log.v(at_data.TAG, "I_AM_IN=" + I_AM_IN);
I_AM_IN = true;
// Access resource
//
// Multiple threads do enter here!
Log.v(at_data.TAG, "I_AM_OUT=" + I_AM_IN);
I_AM_IN = false;
}
}
我可能错过了一些东西,但没有找到任何说明它不应该工作的文档!?。
输出:
I_AM_IN=false
I_AM_IN=true
I_AM_OUT=true
I_AM_OUT=false
但大多数时候是这样的:
I_AM_IN=false
I_AM_OUT=true
I_AM_IN=false
I_AM_OUT=true
【问题讨论】:
-
你确定多个线程同时在同步块内吗?
-
哦,是的。编辑同步块并添加输出。这快把我逼疯了!
-
我只能认为
lock正在改变。也许如果你将它设置为final,你会发现在哪里。 -
你能发一个完整的例子吗?
-
另外,Integer.valueOf(0) 不应用作锁。它(可能)是一个共享对象,如果其他类像您一样这样做,您将同步不相关的块,从而导致缓慢(在好的情况下)或死锁(在坏的情况下)。只需改用
new Object()。
标签: java android constructor synchronized