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

Java 增加锁数的最佳方法是什么?,java,concurrency,locks,Java,Concurrency,Locks,这个问题是基于这个问题的,也是从这个问题中产生的 我想知道在Java中增加锁数量的最佳方法是什么。除了在ConcurrentHashMap中实现的,即基于固定数组并通过计算键的散列来引用数组的索引 以下是预期结果。 如果一个对象的domoreting()正在处理中,那么如果从不同线程调用同一个对象,我就不应该对它执行doAnotherThing() public void doSomething(int i) { doAnotherThing(i);// some checks here

这个问题是基于这个问题的,也是从这个问题中产生的

我想知道在Java中增加锁数量的最佳方法是什么。除了在
ConcurrentHashMap
中实现的,即基于固定数组并通过计算键的散列来引用数组的索引

以下是预期结果。 如果一个对象的
domoreting()
正在处理中,那么如果从不同线程调用同一个对象,我就不应该对它执行
doAnotherThing()

public void doSomething(int i) {
    doAnotherThing(i);// some checks here based on it it will call to
                        // doMoreThing
    doMoreThing(i);
}

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

更新以下更改的问题

我想我明白你的目的了:实际上,你希望
int
上的
synchronized
块通过
doSomething
。有两种相对简单的方法来完成您的目标:

a) 多个线程能够用不同的
int
s同时调用
doSomething
真的很重要吗?如果没有,您可以将两个调用放在一个
synchronized(this)


b)
int
s不是
对象
s。如果您将
doSomething
更改为获取一个
整数
,并将调用
doSomething的内容(以及调用该内容的内容等)更改为同时使用
整数
,则可以在
整数
上进行同步。确保每个调用方都使用相同的
Integer
对象非常重要-可以有多个
Integer
对象具有相同的
int
值,但是在不同的
整数
上同步并不能提供您想要的保护。

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

更新以下更改的问题

我想我明白你的目的了:实际上,你希望
int
上的
synchronized
块通过
doSomething
。有两种相对简单的方法来完成您的目标:

a) 多个线程能够用不同的
int
s同时调用
doSomething
真的很重要吗?如果没有,您可以将两个调用放在一个
synchronized(this)


b)
int
s不是
对象
s。如果您将
doSomething
更改为获取一个
整数
,并将调用
doSomething的内容(以及调用该内容的内容等)更改为同时使用
整数
,则可以在
整数
上进行同步。确保每个调用方都使用相同的
Integer
对象非常重要-可能有多个
Integer
s具有相同的
int
值,但是在不同的
Integer
上进行同步不会提供您想要的保护。

更新了问题。我希望现在它更清楚了。是的,锁定一个可以更改的值(如
整数
)是一个非常糟糕的模式,尽管我知道你想得到什么。更新了问题。我希望现在它更清楚了。是的,锁定一个可以改变的值(比如
整数
)是一个非常糟糕的模式,尽管我知道你想得到什么。你的问题令人费解。ConcurrentHashMap不会“增加Java中的锁数”。下面的例子是“如果我在做”,你的帖子是无法理解的。你能参考原始问题吗?你能不能把自己限制在原始问题上,而不是重复发布它。@EJP,因为这是完全不同的上下文。在前面的问题中,上下文是有限的,因为我提到了一些没有提供解决方案的实现。所以现在的问题是有一种不同的方式。我不知道你怎么认为这两件事是一样的。如果你知道答案,我很想听听你的意见:)看看你的问题是不可理解的。ConcurrentHashMap不会“增加Java中的锁数”。下面的例子是“如果我在做”,你的帖子是无法理解的。你能参考原始问题吗?你能不能把自己限制在原始问题上,而不是重复发布它。@EJP,因为这是完全不同的上下文。在前面的问题中,上下文是有限的,因为我提到了一些没有提供解决方案的实现。所以现在的问题是有一种不同的方式。我不知道你怎么认为这两件事是一样的。如果您知道解决方案,我很乐意收到您的来信:)另请参阅