我试着搜索这个问题,但没有找到任何东西,好像我是唯一一个尝试过这个问题的人。
基本上我有一个静态对象,用于在包含类的构造函数内同步资源访问,我不时注意到它不起作用!
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
答案 0 :(得分:3)
根据您的评论,问题是您正在修改锁定。您不能增加Integer对象的值。整数是不可变的,所以每次“递增”它时,你用另一个锁替换锁:
lock = new Integer(lock.intValue() + 1);
使用最终 new Object()
作为锁定,并使用单独的变量来保存计数。或者使用AtomicInteger。信号量可能也是你正在寻找的类。
经验法则:锁定应始终是最终的。并且你永远不应该使用共享对象作为锁(Integer.valueOf(0)
是一个共享对象,因为valueOf(0)
,至少在某些VM实现中,总是返回相同的Integer实例。)
答案 1 :(得分:1)