加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 总是使用’??this’作为监视器锁定是可以接受的吗?

发布时间:2020-12-15 02:03:06 所属栏目:Java 来源:网络整理
导读:例如,我有一个带有2个计数器的类(在多线程环境中): public class MyClass { private int counter1; private int counter2; public synchronized void increment1() { counter1++; } public synchronized void increment2() { counter2++; }} Theres 2增加操
例如,我有一个带有2个计数器的类(在多线程环境中):

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

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

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

}

Theres 2增加操作彼此无关.但是我使用相同的对象来锁定(这个).

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

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

解决方法

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)?

只有你能知道.我们不了解您的性能要求.这实际上是您真实代码中的一个问题吗?您真正的操作是否持久?它们经常发生吗?您是否进行过任何诊断以估计其影响?您是否已将自己的应用程序分析,以了解等待显示器所花费的时间,更不用说何时不必要了?

我实际上建议不要因为完全不同的原因而对此进行同步.当你控制所有东西时,已经很难推理线程 – 但是当你不知道可以获得监视器的所有内容时,你就会隐藏起来.当您对此进行同步时,这意味着任何其他具有对象引用的代码也可以在同一监视器上同步.例如,客户可以使用:

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

这可能导致死锁,性能问题,各种各样的事情.

如果您在类中使用私有final字段,而创建的对象只是一个监视器,那么您知道获取该监视器的唯一代码将是您的代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读