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 通常用于一个线程生产对象,而另外一个线程消费这些对象的场景。
参考资料: