Java 增加锁数的最佳方法是什么?
这个问题是基于这个问题的,也是从这个问题中产生的 我想知道在Java中增加锁数量的最佳方法是什么。除了在Java 增加锁数的最佳方法是什么?,java,concurrency,locks,Java,Concurrency,Locks,这个问题是基于这个问题的,也是从这个问题中产生的 我想知道在Java中增加锁数量的最佳方法是什么。除了在ConcurrentHashMap中实现的,即基于固定数组并通过计算键的散列来引用数组的索引 以下是预期结果。 如果一个对象的domoreting()正在处理中,那么如果从不同线程调用同一个对象,我就不应该对它执行doAnotherThing() public void doSomething(int i) { doAnotherThing(i);// some checks here
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,因为这是完全不同的上下文。在前面的问题中,上下文是有限的,因为我提到了一些没有提供解决方案的实现。所以现在的问题是有一种不同的方式。我不知道你怎么认为这两件事是一样的。如果您知道解决方案,我很乐意收到您的来信:)另请参阅