【问题标题】:What is the best way to increase number of locks? [closed]增加锁数量的最佳方法是什么? [关闭]
【发布时间】:2012-10-15 06:50:16
【问题描述】:

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

【问题讨论】:

  • 您的问题难以理解。 ConcurrentHashMap 不会“增加 Java 中的锁数”。从“下面是我的例子,如果我这样做”,你的帖子是难以理解的。
  • 能否请您限制自己的原始问题,而不是重复发布它。
  • @EJP 因为这是完全不同的上下文。在上一个问题中,上下文受到限制,因为我提到了一些不提供解决方案的实现。所以现在的问题是有不同的方法。不知道你怎么看这两件事是一样的。如果您知道解决方案,我很乐意收到您的来信:)

标签: java concurrency locks


【解决方案1】:

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

在更改后更新问题

我想我看到了你的目标:实际上,你想要 int 上的 synchronizeddoSomething 正在通过。有两种相对简单的方法可以做你想做的事:

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

b) ints 不是 Objects。如果您将doSomething 更改为Integer,并将任何调用doSomething(以及任何调用它等等)更改为也使用Integers,您可以在Integer 上进行同步。重要的是要确保每个调用者都使用相同的 Integer 对象 - 可能有多个 Integers 具有相同的 int 值,但在不同的 Integers 上同步不会提供您正在寻找的保护。

【讨论】:

  • 更新了问题。我希望现在它更清楚了。
  • 是的,锁定一个可以改变的值(比如Integer)是一种非常糟糕的模式,尽管我理解你想要达到的目的。
猜你喜欢
  • 2017-02-11
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
相关资源
最近更新 更多