死锁及解决方法
死锁产生条件:
1、资源互斥
2、占用并等待资源
3、资源不可抢夺
4、循环等待
例子:
package com.example.demo.myLock;
public class LockTest {
static String lockA = "lockA";
static String lockB = "lockB";
public static void main(String[] args) {
new Thread(()->{
System.out.println("进入线程A");
synchronized (lockA) {
System.out.println("线程A获取A锁");
try {
Thread.sleep(3);
synchronized (lockB) {
System.out.println("线程A获取B锁");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("线程A结束");
}).start();
new Thread(()->{
System.out.println("进入线程B");
synchronized (lockB) {
System.out.println("线程B获取B锁");
try {
Thread.sleep(1);
synchronized (lockA) {
System.out.println("线程B获取A锁");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("线程B结束");
}).start();
}
}
解决方法:
1.换成粗粒度锁
2.锁排序法
3.使用ReentrantLock.tryLock(long,TimeUnit)
4.使用开放调用
5.使用锁的替代品