多线程 死锁

嵌套锁。

两个线程调用的同步代码中有嵌套锁。

一个线程的内层锁在另外一个线程的外部锁,一个线程的外部锁在另外一个线程的内部锁,

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();

        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值