适当使用同步或锁定一段代码

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案1】:

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

class Employee 

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

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

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

【讨论】:

以上是关于适当使用同步或锁定一段代码的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 发出同步请求时,如何防止浏览器锁定(或显示等待符号)?

Java同步静态方法:锁定对象或类

如何在 Java 中同步或锁定变量?

同步使对象锁定

qt多线程中怎样锁定一个指定的变量?

java线程同步和锁定没有效果?