JUC——线程同步锁(锁处理机制简介)
锁处理机制简介
juc的开发框架解决的核心问题是并发访问和数据安全操作问题,当进行并发访问的时候如果对于锁的控制不当,就会造成死锁这样的阻塞问题。
为了解决这样的缺陷,juc里面重新针对于锁的概念进行了设计。
JUC锁机制
JUC锁机制包括以下几个组成部分:
- 核心接口:Lock,ReadWriteLock;
- AQS抽象类:
- AbstractOwnableSynchronizer (排它锁);
- AbstractQueuedSynchronizer (为实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量、事件,等等)提供一个框架);
- AbstractQueuedLongSynchronizer (64位同步器)
- 工具类:
- Reentrantock互斥锁、ReadWriteLock读写锁、Condition控制队列
- LockSupport阻塞原语、Semaphore信号量、CountDownLatch闭锁
- CyclicBarrier栅栏、Exchanger交换机、CompletableFuture线程回调
之所以在juc里面要重新提供一系列的锁的处理工具类,其根本原因在于,Java原始的锁机制(synchronized)虽然可以提供有数据的安全访问机制,但是其缺点也是非常明显的:所有的线程对象只能享受一把锁。
java.util.concurrent锁概览
- java.util.concurrent.locks提供了锁的基础支持;
- Lock接口:支持语义不同(重入、公平等)的锁规则
- 语义不同,是指锁可是有 “公平机制的锁”、“非公平机制的锁”、“可重入的锁”等等;
- 公平机制:指不同线程获取锁的机制是公平的;
- 非公平机制:指不同线程获取锁的机制是非公平的;
- 可重入的锁:指同一个锁能够被一个线程多次获取,可重入锁最大的作用是避免死锁。
- 语义不同,是指锁可是有 “公平机制的锁”、“非公平机制的锁”、“可重入的锁”等等;
- ReadWriteLock接口和Lock类似的方式定义了一些读取者可以共享而写入独占的锁;
- Condition接口描述了可能会与锁有关的条件变量(与Objec类的wait()方法使用类似)。
公平锁核心概念
- AbstractQueuedSynchronizer:是Java管理 “锁”的抽象类,锁的许多公共方法都是都是在这个类中实现。AbstractQueuedSynchronizer是独占锁(例如,ReentrantLock)。
- AbstractQueuedSynchronizer类别:
- 独占锁:锁在同一个时间点只能被一个线程锁占有。根据锁的获取机制,它有划分为“公平锁”和“非公平锁”。公平锁是按照通过CLH等待线程按照先来先得的规则公平的获取锁;而非公平锁则当线程获取锁时,它会无视CLH等待队列而直接回去锁。
- 共享锁:能被多个线程同时拥有,能被共享的锁。
- CLH队列(Craig,Landin,and Hagersten locks):CLH锁也是一种基于链表的可扩展、高性能、公平的自旋锁,申请线程只在本地变量上自旋,它不断轮询前驱的状态,如果发现前驱释放了锁就结束自旋。
- CAS方法(Compare And Swap):比较并交换方法,它是原子操作方法:即,通过CAS操作的数据都是以原子方式进行的。
CLH锁——解决死锁问题