gpt4 book ai didi

java - 始终使用 'this' 作为监视器锁是可以接受的吗?

转载 作者:搜寻专家 更新时间:2023-11-01 03:58:57 25 4
gpt4 key购买 nike

例如我有一个带有 2 个计数器的类(在多线程环境中):

public class MyClass {
private int counter1;
private int counter2;

public synchronized void increment1() {
counter1++;
}

public synchronized void increment2() {
counter2++;
}

}

有 2 个增量操作彼此不相关。但我使用相同的对象进行锁定 (this)。

的确,如果客户端同时调用increment1()increment2() 方法,那么increment2 调用将被阻塞,直到increment1() 释放 this 监视器?

如果是这样,是否意味着我需要为每个操作提供不同 监视器锁(出于性能原因)?

最佳答案

It is true that if clients simultaneously calls increment1() and increment2() methods, then increment2 invocation will be blocked until increment1() releases the this monitor?

如果它们在同一个实例上被调用,则可以。

If it's true, does it mean that I need to provide different monitor locks for each operation (for performance reasons)?

只有你自己知道。我们不知道您的性能要求。这实际上是您实际代码中的问题吗?您的实际操作是否持久?它们是否经常发生?您是否执行过任何诊断来估计其影响?您是否对您的应用程序进行了概要分析,以找出等待监视器所花费的时间,更不用说在不必要的时候了?

出于完全不同的原因,我实际上建议不要在 this 上进行同步。当您确实控制所有内容时,已经很难推理出线程 - 但是当您不知道可以获取监视器的所有内容时,您就无所遁形了。当您在 this 上同步时,这意味着任何引用您的对象的 other 代码也可以在同一监视器上同步。例如,客户可以使用:

synchronized (myClass) {
// Do something entirely different
}

这可能会导致死锁、性能问题等各种问题。

如果您在类中使用 private final 字段,创建一个对象只是作为监视器,那么您知道获取该监视器的唯一代码将成为你的代码。

关于java - 始终使用 'this' 作为监视器锁是可以接受的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14577550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com