特性:原子性,可见性,有序性
1、synchronized:隐式获取释放锁的方式。
synchronized锁升级:无锁、偏向锁、轻量锁(自旋锁)、重量锁(10次自旋锁后)
2、Lock:主动获取和释放锁,具有可操作性、超时获取锁、等多种特性。
Lock是一个接口,定义了锁的基本操作。Lock接口的实现基本都是通过聚合了一个同步器的子类来完成现场访问控制。
公平锁 / 非公平锁
可重入锁 / 不可重入锁
独享锁 / 共享锁
互斥锁 / 读写锁
乐观锁 / 悲观锁
分段锁
偏向锁 / 轻量级锁 / 重量级锁
自旋锁
独占锁与共享锁
独占锁:只有一个线程可以获取到锁
共享锁:有多个线程可以获取到锁(如多个线程可以同时读)
公平锁与非公平锁
公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。 每个线程都会得到锁的资源,按照请求时间,先入先出。但是除了头节点的线程其他都要被阻塞,cpu唤醒阻塞线程开销很大。
非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。 可以减少CPU唤醒线程的开销,整体的吞吐效率会高点,CPU也不必取唤醒所有线程,会减少唤起线程的数量。但是可能会导致有些线程一直抢不到锁。
ReentarntLock:可重入锁 (记得释放)
ReentarntReadWriteLock:可重入读写锁
AQS:AbstractQueuedSynchronizer是用来构建锁或者其他同步组件的基础框架,它使用了一个int的成员变量(state)表示同步状态,通过内置的FIFO(先入先出)队列来完成资源获取线程的排队工作。
getState():获取当前的同步状态
setState(int newState):设置当前的同步状态
compareAndSetState(int expect,int update):使用CAS设置当前的状态,保证原子性