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