java - Android:构造函数内部的同步()无效?

标签 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

最佳答案

根据您的评论,问题是您正在修改锁。您不能增加 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/

相关文章:

java - 在安装了 OpenJDK 11 的情况下启动 OWASP ZAP 时出现问题

android - 如何在 unicode 中给出项目名称

谷歌地图的 Android 替代品(离线)

c++ - 在 C++ 中初始化位域结构的最佳方法是什么?

java - Java与Golang http性能比较

java - 在grails中上传图片

java - ArrayList,将字符串传递给Android fragment

java - 以编程方式更改组件树上的布局/UI 元素顺序

c# - c#构造函数的问题

java - 如何横切带注释的方法和构造函数?