(一)CAS(compare and swap)比较交换
1,CAS是基于冲突检测的乐观锁,CAS包括三个运算符内存地址V、期望的值A、一个新值B。基本思路:如果地址V上的值和期望的值A相等,就给地址V赋给新值B,如果不是,不做任何操作。例如:内存地址V=5,C线程拿到V后做加1运算,突然D线程把V改成了6,C线程CAS操作修改V时发现期望值A=5,V=6不相等又循环重新拿V做加1操作,直至V=A修改成功不然循环(死循环,自旋)里不断的进行CAS操作
2,CAS存在的问题
1>ABA问题:线程1拿到数据后,线程将数据修改了,然后又修改回来了。
2>自旋的时候开销大
(二)synchronized
1,使用方式:1>修饰方法:获取当前对象的锁
2>修饰静态方法:获取当前类的锁,会作用与类的所有对象
3>修饰代码块:获取指定加锁对象的锁
2,synchronized底层实现
synchronized底层是借助操作系统的互斥锁Mutex Lock实现的,当对象被new出来后会创建一个监视器,线程只有获得监视器才可以获得锁,当线程获得锁后监视器的值会加1,只有重新变回0的时候才可以被其他的线程获得锁。
3,synchronized可重入的原理
可重入指的是当线程获取到了这个锁之后还可以再次获取这个锁。synchronized底层维护了一个计数器,每当这个线程获取一次,计数器就会加1,释放一次锁就会减1
4,synchronized锁升级
1>1.8之前synchronized是重量级锁。1.8之后synchronized进行的优化,引入了锁的升级(无锁->偏向锁->轻量锁->重量锁)。
2>对象刚创建出来是无锁状态的,当线程获取锁的时候会先判断mark word的后两位值是不是01,然后判断是否为偏向锁,不是则通过CAS操作将mark word的前23位修改成线程自己的ID,升级为偏向锁
3>当多个线程获取同一个锁的时候,就会升级为轻量锁。当多个线程过来试图获取锁的时候,首先会判断获取锁的线程ID是否和偏向锁保存的线程ID一致,如果不是就会判断获取到该偏向锁的线程是否存活,如果没有存活就会在安全点替换ID,如果存活,就升级为轻量锁。升级轻量锁会在栈空间中创建一个空间保存拷贝过来的mark word和lock recorde,然后通过CAS操作修改锁记录指针指向lock record升级为轻量锁,没有获得锁的线程开始自旋尝试获取锁
4>当自旋获取锁的线程长时间获取不到锁的时候,就会升级为重量锁,阻塞自旋线程
(三)AQS
1,AQS的核心思想是如果共享的资源是空闲的话,就把当前请求资源的线程设置成有限线程,如果非空闲,就将想要获取资源而获取不到的线程放入队列中
2,以ReentrantLock为例