gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:36:50 29 4
gpt4 key购买 nike

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

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

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com