Android:synchronized()内部构造函数没有效果?

时间:2013-02-24 09:11:54

标签: java android constructor 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

2 个答案:

答案 0 :(得分:3)

根据您的评论,问题是您正在修改锁定。您不能增加Integer对象的值。整数是不可变的,所以每次“递增”它时,你用另一个锁替换锁:

lock = new Integer(lock.intValue() + 1);

使用最终 new Object()作为锁定,并使用单独的变量来保存计数。或者使用AtomicInteger。信号量可能也是你正在寻找的类。

经验法则:锁定应始终是最终的。并且你永远不应该使用共享对象作为锁(Integer.valueOf(0)是一个共享对象,因为valueOf(0),至少在某些VM实现中,总是返回相同的Integer实例。)

答案 1 :(得分:1)