一、自旋锁 vs 互斥锁
1. 自旋锁:当一个线程获取锁时,如果锁已经被其他线程获取,当前线程就while进行重试,不进入休眠阻塞,减少线程上线文切换,但是循环等待消耗CPU
2. 互斥锁:当一个线程获取锁后,其余线程进入休眠阻塞,进行线程上下文切换
二、悲观锁 vs 乐观锁
1. 悲观锁:先锁定共享资源,同时只有一个线程执行,其余线程等待
2. 乐观锁:不锁定,多个线程同时执行操作共享资源,当有冲突时重试,例如CAS算法
三、可重入锁 vs 不可重入锁
1. 可重入锁:一个线程可以多次获取一个锁
2. 不可重入锁:一个锁只能被获取一次,被释放后才能被再次获取
四、公平锁 vs 不公平锁
1. 公平锁:等待时间最长的线程优先获取锁
2. 不公平锁:存在线程饥饿问题,自旋锁是非公平锁
五、读写锁
1. 读锁:当有读锁时,不能加写锁,但可以加多个读锁
2. 写锁:当有写锁时,不能加其他锁
3. 当有多个线程加了读锁,此时有线程要加写锁,会怎么样?
六、锁消除
JVM在编译时,去除不可能存在共享资源竞争的锁
参考: