1. 自旋锁

自旋锁是采用让当前线程不停地的在循环体内执行实现的,
当循环的条件被其他线程改变时,才能进入临界区。

由于自旋锁只是将当前线程不停地执行循环体,不进行线
程状态的改变,所以响应速度更快。但当线程数不停增加
时,性能下降明显,因为每个线程都需要执行,占用CPU时
间。如果线程竞争不激烈,并且保持锁的时间段。适合使用自旋锁

2. 阻塞锁

阻塞锁,可以说是让线程进入阻塞状态进行等待,当获得相应的信号
(唤醒,时间) 时,才可以进入线程的准备就绪状态,准备就绪状态
的所有线程,通过竞争,进入运行状态。

JAVA中,能够进入\退出、阻塞状态或包含阻塞锁的方法有:
synchronized 关键字(其中的重量锁),ReentrantLock,Object.wait()\notify()

阻塞锁的优势在于,阻塞的线程不会占用cpu时间, 不会导致 CPu占用率过高,
但进入时间以及恢复时间都要比自旋锁略慢。

在竞争激烈的情况下 阻塞锁的性能要明显高于 自旋锁。

理想的情况则是; 在线程竞争不激烈的情况下,使用自旋锁,竞争激烈的情况下使用,阻塞锁。

3. 可重入锁(可以多次进入锁的域)

可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,
内层递归函数仍然有获取该锁的代码,但不受影响。

在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁
可重入锁最大的作用是避免死锁

4. 读写锁

5. 互斥锁

锁本身就是互斥的

6. 悲观锁

不相信,这里会是安全的,必须全部上锁

7. 乐观锁

相信,这里是安全的。

8. 公平锁

有优先级的锁

9. 非公平锁

无优先级的锁

10. 偏向锁

无竞争不锁,有竞争挂起,转为轻量锁

11. 对象锁

锁住对象

12. 线程锁

13. 锁初化

多锁变成一个,自己处理

14. 轻量级锁

CAS 实现

15. 锁消除

偏向锁就是锁消除的一种

16. 锁膨胀

jvm实现,锁粗化

17. 信号量

使用阻塞锁 实现的一种策略