Java并发编程之原子变量与非阻塞同步机制

 更新时间:2015年04月14日 09:12:39   投稿:junjie  
这篇文章主要介绍了Java并发编程之原子变量与非阻塞同步机制,本文讲解了非阻塞算法、悲观技术、乐观技术、CAS操作、原子变量、性能比较:锁与原子变量等内容,需要的朋友可以参考下

1.非阻塞算法

非阻塞算法属于并发算法,它们可以安全地派生它们的线程,不通过锁定派生,而是通过低级的原子性的硬件原生形式 —— 例如比较和交换。非阻塞算法的设计与实现极为困难,但是它们能够提供更好的吞吐率,对生存问题(例如死锁和优先级反转)也能提供更好的防御。使用底层的原子化机器指令取代锁,比如比较并交换(CAS,compare-and-swap).

2.悲观技术

独占锁是一种悲观的技术.它假设最坏的情况发生(如果不加锁,其它线程会破坏对象状态),即使没有发生最坏的情况,仍然用锁保护对象状态.

3.乐观技术

依赖冲突监测.先更新,如果监测发生冲突发生,则放弃更新后重试,否则更新成功.现在处理器都有原子化的读-改-写指令,比如比较并交换(CAS,compare-and-swap).

4.CAS操作

CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。CAS典型使用模式是:首先从V中读取A,并根据A计算新值B,然后再通过CAS以原子方式将V中的值由A变成B(只要在这期间没有任何线程将V的值修改为其他值)。

清单 3. 说明比较并交换的行为(而不是性能)的代码

复制代码 代码如下:

public class SimulatedCAS {
     private int value;

     public synchronized int getValue() { return value; }

    public synchronized int compareAndSwap(int expectedValue, int newValue) {
         int oldValue = value;
         if (value == expectedValue)
             value = newValue;
         return oldValue;
     }
}


清单 4. 使用比较并交换实现计数器
复制代码 代码如下:

public class CasCounter {
    private SimulatedCAS value;
    public int getValue() {
        return value.getValue();
    }
    public int increment() {
        int oldValue = value.getValue();
        while (value.compareAndSwap(oldValue, oldValue + 1) != oldValue)
            oldValue = value.getValue();
        return oldValue + 1;
    }
}

5.原子变量

原子变量支持不用锁保护就能原子性更新操作,其底层用CAS实现。共有12个原子变量,可分为4组:标量类、更新器类、数组类以及复合变量类。最常用的原子变量就是标量类:AtomicInteger、AtomicLong、AtomicBoolean以及AtomicReference。所有类型都支持CAS。

6.性能比较:锁与原子变量

在中低程度的竞争下,原子变量能提供很高的可伸缩性,原子变量性能超过锁;而在高强度的竞争下,锁能够更有效地避免竞争,锁的性能将超过原子变量的性能。但在更真实的实际情况中,原子变量的性能将超过锁的性能。

相关文章

  • 使用@SpringBootTest注解进行单元测试

    使用@SpringBootTest注解进行单元测试

    这篇文章主要介绍了使用@SpringBootTest注解进行单元测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 一文读懂Java多线程背后的故事

    一文读懂Java多线程背后的故事

    Java是一种广泛使用的编程语言,而多线程是Java程序员必不可少的一部分,Java的多线程支持具有确保数据同步、最大化利用CPU资源、并行处理任务等众多优点,本文从实际应用场景出发,为您详细介绍 Java 多线程的各个方面的实际应用及背景
    2023-06-06
  • java处理csv文件上传示例详解

    java处理csv文件上传示例详解

    这篇文章主要为大家详细介绍了java处理csv文件上传示例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • Java受检异常的一些思考

    Java受检异常的一些思考

    受检异常是否真的有必要?这是一个争论了很久的问题,至今仍然没有一个确定的答案。Java的受检异常,被很多人吐槽,也被很多人喜爱,当然他们都可以拿出很多的理由来证明自己的观点。
    2020-12-12
  • windows下java -jar 后台运行以及杀死后台进程的操作

    windows下java -jar 后台运行以及杀死后台进程的操作

    这篇文章主要介绍了windows下java -jar 后台运行以及杀死后台进程的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Mybatis Plus框架项目落地实践分析总结

    Mybatis Plus框架项目落地实践分析总结

    这篇文章主要为大家介绍了Mybatis Plus框架项目落地实践分析总结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 解决idea web项目中out目录更新不同步问题

    解决idea web项目中out目录更新不同步问题

    这篇文章给大家介绍了idea web项目中out(maven中是target)目录更新不同步,导致访问404的问题,本文给大家分享解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-09-09
  • FastJSON字段智能匹配踩坑的解决

    FastJSON字段智能匹配踩坑的解决

    这篇文章主要介绍了FastJSON字段智能匹配踩坑的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java常用API类之Math System tostring用法详解

    Java常用API类之Math System tostring用法详解

    System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包,Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数,toString() 方法用于返回以一个字符串表示的 Number 对象值
    2021-10-10
  • java打包成jar并执行jar包中指定的main方法

    java打包成jar并执行jar包中指定的main方法

    这篇文章主要介绍了如何将java打包成可执行的jar,并执行jar包中指定的main方法的相关资料,文中给出了详细的示例代码,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03

最新评论