Java中的各种锁简介

一、自旋锁 vs 互斥锁

1. 自旋锁:当一个线程获取锁时,如果锁已经被其他线程获取,当前线程就while进行重试,不进入休眠阻塞,减少线程上线文切换,但是循环等待消耗CPU

2. 互斥锁:当一个线程获取锁后,其余线程进入休眠阻塞,进行线程上下文切换

二、悲观锁 vs 乐观锁

1. 悲观锁:先锁定共享资源,同时只有一个线程执行,其余线程等待

2. 乐观锁:不锁定,多个线程同时执行操作共享资源,当有冲突时重试,例如CAS算法

三、可重入锁 vs 不可重入锁

1. 可重入锁:一个线程可以多次获取一个锁

2. 不可重入锁:一个锁只能被获取一次,被释放后才能被再次获取

四、公平锁 vs 不公平锁

1. 公平锁:等待时间最长的线程优先获取锁

2. 不公平锁:存在线程饥饿问题,自旋锁是非公平锁

五、读写锁

1. 读锁:当有读锁时,不能加写锁,但可以加多个读锁

2. 写锁:当有写锁时,不能加其他锁

3. 当有多个线程加了读锁,此时有线程要加写锁,会怎么样?

六、锁消除

JVM在编译时,去除不可能存在共享资源竞争的锁

参考:

https://blog.csdn.net/qq_34337272/article/details/81252853

https://blog.csdn.net/lengxiao1993/article/details/81568130

原文地址:https://www.cnblogs.com/june0816/p/7295719.html