1、公平锁、非公平锁
公平锁:不能插队,先来后到
非公平锁:可以插队,可以插队 (默认都是非公平锁)
2、可重入锁
也叫递归锁
测试的方法相同
Synchronized版
输出结果:
Lock版 必须成对使用
结果:
3、自旋锁
自己实现自旋锁代码:
测试方法:
结果:T1拿到锁,T2在等待T1解锁进行自旋,T1解锁后后,T2拿到锁停止自旋
4、死锁
死锁代码示例:
传入的时候把字符串反过来了。这里的锁对象是上面的定义的两个字符串,T1线程的A锁是字符串A,T2线程的A锁是字符串B,这样两个线程获取字符串AB的锁就卡死了
解决问题:
1)使用 jps 定位进程号
命令号:jps -l
2)使用jstack查看进程号
面试工作中 --> 排查死锁问题:
1)日志
2)查看堆栈信息