此问题基于Synchronizing on an Integer results in NullPointerException,源自此问题Synchronizing on an Integer value
我想知道增加Java中锁数的最佳方法是什么。除了在ConcurrentHashMap
中实现,即基于固定数组并通过计算键的散列来引用数组的索引?
以下是预期的。
如果一个对象的doMoreThing()
正在处理中,那么如果它从不同的线程调用,我不应该为同一个对象做doAnotherThing()
。
public void doSomething(int i) {
doAnotherThing(i);// some checks here based on it it will call to
// doMoreThing
doMoreThing(i);
}
答案 0 :(得分:4)
Java中的每个Object
都有一个关联的锁。如果您想要新锁,可以创建新的Object
。引用的问题并没有说明为什么你试图增加锁的数量,或者你的意思是什么。也许你可以提供更多细节。
更新以下更改的问题
我想我明白了你的目标:实际上,你希望synchronized
int
阻止doSomething
传递。有两种相对简单的方法可以完成您的工作:
a)真的重要的是,多个线程能够与不同的 doSomething
同时调用int
吗?如果没有,您可以将两个电话都放在synchronized(this)
b)int
s不是Object
s。如果您更改doSomething
以取Integer
并更改正在调用的任何内容doSomething
(以及正在调用的内容等等)也可以使用Integer
,则可以同步Integer
。这里重要的是确保每个调用者都使用相同的Integer
对象 - 可能有多个Integer
具有相同的int
值,但在不同的{{1}上进行同步不会提供你正在寻找的保护。