一、Java常用锁:
1)可重入锁,不可重入锁:
2)乐观锁,悲观锁
3)公平锁,非公平锁
4)互斥锁,共享锁
Synchronized:可重入,悲观锁,非公平锁,互斥锁
ReentrantLock:可重入,悲观锁,非公平锁和公平锁,互斥锁
ReentrantReadWriteLock:可重入,悲观锁,非公平锁和公平锁,有互斥锁和共享锁

Synchronized:
Jdk1.6优化:
1)锁消除:若不存在临界资源访问,则不会触发加锁
2)锁膨胀:在一个循环中,频繁获取和释放锁资源,则会将锁范围扩大
3)锁升级:
1.无锁,匿名偏向锁:当前对象没有作为锁存在。
2.偏向锁:如果当前锁资源,只有一个线程在频繁的获取和释放,那么这个 线程过来,只需要判断,当前指向的线程是否是当前线程:如果是当前线程, 则直接获取,不是则基于CAS获取锁,如果获取不到,触发锁升级,升级为 轻量级锁。
3.轻量级锁:采取自旋方式频繁以CAS方法获取锁,如果自旋一定次数未 获取到,则升级为重量级锁。
4.重量级锁:传统方法,拿不到锁资源就挂起当前线程。

实现原理:基于对象实现的锁,java对象会在堆内存中开辟一段空间,存储对象头,对象头里面有markwork,markwork存储了不同锁在不同状态下的信息。
原子性:通过字节码指令monitorenter和monitorexit实现原子性,加锁后其他线程无法获得锁,当CPU时间片用完且未执行结束,则下个时间片继续运行并且无法被其他线程获取。
有序性:同一时间只能被一个线程访问,但无法避免指令重排。

CAS:
概念:compare and swap,是一条CPU并发原语,先查看内存中的值是否与预期值一致,一致则执行替换操作。
优点:避免线程挂起和唤醒,避免用户态和内核态切换成本
缺点:ABA问题(利用版本号解决),自旋时间过长(设置自选次数,超过则失败或挂起)

最后修改:2022 年 08 月 23 日
如果觉得我的文章对你有用,请随意赞赏