增加锁数的最佳方法是什么?

时间:2012-10-15 06:50:16

标签: java concurrency locks

此问题基于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);
}

1 个答案:

答案 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}上进行同步不会提供你正在寻找的保护。