• Java基础


    Java基础 - 并发包

    一、什么是CAS

      CAS的全称为 Compare-And-Swap,直译就是对比并交换。是一条CPU的原子指令,其作用是让 CPU 先进行比较两个值是否相等,然后原子地更新某个位置的值,

    经过调查发现,其实现方式是基于硬件平台的汇编指令,就是说CAS是靠硬件实现的,JVM只是封装了汇编调用,那些AtomicInteger类便是使用了这些封装后的接口。

        简单解释:CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下在旧值有没有发生变化,

    如果没有发生变化,才交换成新值,发生了变化则不交换。

        CAS操作是原子性的,所以多线程并发使用CAS更新数据时,可以不使用锁。JDK中大量使用了CAS来更新数据而防止加锁(synchronized 重量级锁)来保持原子更新。

    二、原子类

     java.util.concurrent包都中的实现类都是基于 volatile 和 CAS 来实现的。尤其java.util.concurrent.atomic包下的原子类。

    • AtomicInteger
    • AtomicLong
    • AtomicBoolean
    • AtomicReference

    三、ConcurrentHashMap

    jdk 1.7:分段锁

    jdk 1.8:node 数组 + 链表/红黑树,并发控制 使用 synchronized 和 CAS 来操作。

    四、Lock

    Lock 和 synchronized 代码块的主要不同点:

    • synchronized 代码块不能够保证进入访问等待的线程的先后顺序。
    • 你不能够传递任何参数给一个 synchronized 代码块的入口。因此,对于 synchronized 代码块的访问等待设置超时时间是不可能的事情。
    • synchronized 块必须被完整地包含在单个方法里。而一个 Lock 对象可以把它的 lock() 和 unlock() 方法的调用放在不同的方法里。

    五、执行器服务 ExecutorService

    java.util.concurrent.ExecutorService 接口表示一个异步执行机制,使我们能够在后台执行任务。

    因此一个 ExecutorService 很类似于一个线程池。实际上,存在于 java.util.concurrent 包里的 ExecutorService 实现就是一个线程池实现。

    ThreadPoolExecutor

    六、BlockingQueue

    java.util.concurrent 包里的 BlockingQueue 接口表示一个线程安放入和提取实例的队列。本小节我将给你演示如何使用这个 BlockingQueue。

    BlockingQueue 通常用于一个线程生产对象,而另外一个线程消费这些对象的场景。

    参考资料:

    Java 并发工具包 java.util.concurrent 用户指南

    Java中的13个原子操作类总结

    java原子类原理与CAS

    详解java并发原子类AtomicInteger(基于jdk1.8源码分析)

  • 相关阅读:
    Gitlab 自带Nginx与原Nginx冲突的解决方案
    宝塔PHP7.3版本安装ZIP扩展
    GitLab配置ssh key
    Git Windows打分支 并推送到远程
    proj4 coordinates must be finite numbers
    uniapp APP端水印相机实现
    uniapp使用逆地理编码
    uniapp sqlite数据库使用
    uniapp APP 定位获取
    uniapp打包流程
  • 原文地址:https://www.cnblogs.com/wangwangfei/p/13635392.html
Copyright © 2020-2023  润新知