Java高并发编程学习--8. 线程的死锁

一、死锁的原因

package mian;

import static java.lang.Thread.currentThread;

/**
 * @ClassName DeadLock
 * @Description TODO
 * 程序死锁的原因:
 * 1. 交叉锁导致死锁
 * 2. 内存不足
 * 3. 一问一答式的数据交换(客户/服务器)
 * 4. 数据库锁
 * 5. 文件锁
 * 6. 死循环导致死锁
 * 7. ......
 * @Author Cays
 * @Date 2019/3/13 15:35
 * @Version 1.0
 **/
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(currentThread().getName()+" get READ lock");
            synchronized (MUTEX_WRITE){
                System.out.println(currentThread().getName()+" get WRITE lock");
            }
            System.out.println(currentThread().getName()+" release READ lock");
        }
    }
    public void write(){
        synchronized (MUTEX_WRITE){
            System.out.println(currentThread().getName()+" get WRITE lock");
            synchronized (MUTEX_READ){
                System.out.println(currentThread().getName()+" get READ lock");
            }
            System.out.println(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();

    }
}

二、交叉死锁结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39400984/article/details/89785346
今日推荐