2012-10-15 49 views
0

这个问题是基于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

你的问题是无法理解的。 ConcurrentHashMap不会'增加Java中的锁的数量'。从'下面是我的例子,如果我在做'你的帖子是无法理解的。 – EJP

+0

你可以请参考原始问题http://stackoverflow.com/questions/659915/synchronizing-on-an-integer-value。 –

+0

可以*您*请将自己局限于原始问题,而不是重复发布。 – EJP

回答

4

Java中的每个Object都有一个关联的锁。如果你想要一个新的锁,你可以创建一个新的Object。引用的问题并没有说明你为什么试图增加锁的数量,或者你的意思。也许你可以提供更多的细节。

更新以下修改相关

我想我明白你想做什么:有效,你想在一个int​​块doSomething被获得通过。有两种比较简单的方法可以做到你以后:

一)是不是真的重要几个线程能够与不同int:张知仪打电话doSomething?如果不是,您可以将两个呼叫放在一个synchronized(this)

b)int s不是Object s。如果您将doSomething更改为Integer,并且还更改所有调用doSomething(以及其他任何东西的调用等等)以使用Integer s,则可以同步Integer。这里很重要的一点是确保每个来电者都使用相同的Integer对象 - 可能有多个Integer s具有相同的int值,但在不同的Integer上同步不会提供您正在寻找的保护。

+0

更新了问题。我希望现在它更清楚。 –

+0

是的,锁定一个可以改变的值(像一个'Integer')是一个非常糟糕的模式,尽管我明白你想要的是什么。 – Gray

相关问题