嵌套锁。
两个线程调用的同步代码中有嵌套锁。
一个线程的内层锁在另外一个线程的外部锁,一个线程的外部锁在另外一个线程的内部锁,
A已经获得读锁,B已经获得写锁 A再去获取写锁,B再去获取读锁,读写锁都被另一个线程持有,方法不能继续向下执行,一直处于阻塞状态;
public class DeadLock {
private final Object MUTEX_READ = new Object();
private final Object MUTEX_WRITE = new Object();
public void read() {
synchronized (MUTEX_READ) {
System.out.println(Thread.currentThread() + " GET WRITE LOCK");
synchronized (MUTEX_WRITE) {
System.out.println(Thread.currentThread() + " GET READ LOCK");
System.out.println("I am reading a bull shit, you mother fucker!");
}
System.out.println(Thread.currentThread() + " RELEASE READ LOCK");
}
System.out.println(Thread.currentThread() + " RELEASE WRITE LOCK");
}
public void write() {
synchronized (MUTEX_WRITE) {
System.out.println(Thread.currentThread() + " GET READ LOCK");
synchronized (MUTEX_READ) {
System.out.println(Thread.currentThread() + " GET WRITE LOCK");
}
System.out.println(Thread.currentThread() + " RELEASE WRITE LOCK");
}
System.out.println(Thread.currentThread() + " RELEASE READ LOCK");
}
public static void main(String[] args) {
final DeadLock deadLock = new DeadLock();
for (int i = 0; i < 20; i++) {
new Thread(deadLock::read).start();
new Thread(deadLock::write).start();
}
}
}
package phase1.chapter4;
import java.util.HashMap;
import java.util.Map;
/**
* @classname: HashMapDeadLock
* @description:另外一个死锁现象,会搞死机!!!!!! 慎重运行!!!!!!!
*/
public class HashMapDeadLock {
private final Map<String, String> map = new HashMap<>();
//写方法
public void put(String key, String value) {
this.map.put(key, value);
}
public static void main(String[] args) {
final HashMapDeadLock lock = new HashMapDeadLock();
//10个线程运行写方法,会造成死锁
for (int x = 0; x < 10; x++) {
new Thread(() -> {
for (int i = 0; i < Integer.MAX_VALUE; i++) {
lock.put(String.valueOf(i), String.valueOf(i));
}
}).start();
}
}
}