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源码分析)

posted @ 2020-09-08 20:57  风过无痕521  阅读(433)  评论(0编辑  收藏  举报