有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

共 (2) 个答案

  1. # 2 楼答案

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

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

    使用finalnew Object()作为锁,并使用单独的变量保存计数。或者使用原子整数。信号量也可能是您正在寻找的类

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