【问题标题】:Appropriate use of synchronizing or locking a segment of code适当使用同步或锁定一段代码
【发布时间】:2021-09-22 06:07:36
【问题描述】:

给定一个具有 2 个方法的单例类 Employee int getSalary() void updateSalary(int increment)

我需要同步或锁定这两个函数还是使用原子工资变量? 如果是,那么问题是,以这种方式,我们必须同步我们在多线程环境中定义的所有函数。那么,为什么不直接将同步作为标准,因为今天没有现实世界的应用程序是单线程的?

【问题讨论】:

    标签: multithreading locking singleton synchronized


    【解决方案1】:

    对于单例,我们总是要非常小心,因为单例对象自然是一个实例,可以在线程之间共享。使函数同步是一种方法,但它不是有效的方法。我们需要考虑并发的其他方面,比如不可变的原子类。

    class Employee {
    
         //singleton instantiation 
         private final AtomicInteger sal  = new AtomicInteger(0);
         
         int getSalary(){
             return sla.get();
         }
         void updateSalary(int increment){
            sla.add(increment);
         }
    }
    

    这样就解决了,我们不需要同步单例类的每个方法。

    我们不必将每个类的每个函数都标记为要同步,但如果函数正在修改状态或读取状态并且可能被并发调用,则必须始终小心,在这种情况下开始考虑同步。但是,对于单例类,我们总是要小心。

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多