1

我尝试搜索这个问题,但没有找到任何东西,好像我是唯一一个尝试过的人。

基本上我有一个静态对象,我用它来同步包含类的构造函数内的资源访问,我不时注意到它不起作用!

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
4

2 回答 2

3

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

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

使用final new Object()作为锁,并使用单独的变量来保存计数。或者使用 AtomicInteger。Semaphore 也可能是您正在寻找的类。

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

于 2013-02-24T09:40:47.960 回答
1

您应该使用私有的最终锁定对象。

于 2013-02-24T09:35:34.343 回答