一 点睛
交叉锁不仅自己写的代码会出现,如果使用某个框架或者开源库,由于对源码 API 的不熟悉,很有可能也会引起死锁,这种情况出现死锁后,排查的困难则要高于前者,所以在使用框架或者开源库的时候要做到了如指掌。
二 代码
package concurrent;
public class DeadLock {
private final Object mutexRead = new Object();
private final Object mutexWrite = new Object();
public void read() {
synchronized (mutexRead) {
System.out.println(Thread.currentThread().getName() + " get READ lock");
synchronized (mutexWrite) {
System.out.println(Thread.currentThread().getName() + " get write lock");
}
System.out.println(Thread.currentThread().getName() + " release write lock");
}
System.out.println(Thread.currentThread().getName() + " release READ lock");
}
public void write() {
synchronized (mutexWrite) {
System.out.println(Thread.currentThread().getName() + " get write lock");
synchronized (mutexRead) {
System.out.println(Thread.currentThread().getName() + " get READ lock");
}
System.out.println(Thread.currentThread().getName() + " release READ lock");
}
System.out.println(Thread.currentThread().getName() + " release write lock");
}
public static void main(String[] args) {
final DeadLock deadLock = new DeadLock();
new Thread(() -> {
while (true) {
deadLock.read();
}
}, "READ-THREAD").start();
new Thread(() -> {
while (true) {
deadLock.write();
}
}, "WRITE-THREAD").start();
}
}
三 测试
READ-THREAD get READ lock
READ-THREAD get write lock
READ-THREAD release write lock
READ-THREAD release READ lock
READ-THREAD get READ lock
READ-THREAD get write lock
READ-THREAD release write lock
READ-THREAD release READ lock
READ-THREAD get READ lock
READ-THREAD get write lock
READ-THREAD