java Android:构造函数中的synchronized()无效?
我试图寻找这个问题,但没有找到任何东西,好像我是唯一一个尝试过的人
基本上,我有一个静态对象,用于在包含类的构造函数中同步资源访问,我不时注意到它不起作用
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
# 1 楼答案
You should use a private final lock object.
# 2 楼答案
根据您的评论,问题是您正在修改锁。不能增加整数对象的值。整数是不可变的,所以每次“递增”它时,都会用另一个锁替换该锁:
使用final
new Object()
作为锁,并使用单独的变量保存计数。或者使用原子整数。信号量也可能是您正在寻找的类经验法则:锁应该是最终的。而且永远不要使用共享对象作为锁(
Integer.valueOf(0)
是一个共享对象,因为valueOf(0)
,至少在某些VM实现中,总是返回相同的整数实例)