• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Aminue
博客园    首页    新随笔    联系   管理    订阅  订阅

Java多线程:死锁

在我们进行多线程的编写中,特别要注意死锁的问题,

        当一个线程永远地持有一个锁,并且其他线程都尝试去获得这个锁时,那么它们将永远被阻塞,造成死锁。

        举例来说就是有A,B两个线程,A持有m锁想要获得n锁,同时B持有n锁想要获得m锁,那么这两个线程就会一直等待,这就是死锁。

下面将给出一个死锁的简单代码并且演示如何分析这是一个死锁:

public class DeadLockDemo {
    
    public static void main(String[] args) {
        
        //new Thread(new DL(true)).start();
        //new Thread(new DL(false)).start();
        
        //是上面语法分解式
        DL a = new DL(true);
        DL b = new DL(false);
        Thread t1 = new Thread(a);
        Thread t2 = new Thread(b);
        t1.start();
        t2.start();
    }
}

class Lock{
    static final Object M = new Object();
    static final Object N = new Object();
}

//自定义一个线程只有两种方法1,(继承Thread类)extends Thread;
//2,(实现接口)implements Runnable
class DL implements Runnable{
    
    private boolean flag;//定义一个私有的flag变量
    
    public DL(boolean flag){
        this.flag = flag;
    }
    
    @Override
    public void run() {
         
        if(flag){
            synchronized (Lock.M) {
                System.out.println("if la run");
                synchronized (Lock.N) {
                    System.out.println("if lb run");
                }
            }
        }else{
            synchronized (Lock.N) {
                System.out.println("else lb run");
                synchronized (Lock.M) {
                    System.out.println("else la run");
                }
            }
        }
        
    }
    
}

 当我们运行时,我们会发现会输出  

if la run
else lb run

然后就会因为需要对方的锁形成死锁。

(先输出哪个是进程之间抢占资源先后,与代码无关)

 

避免死锁的方法:

(1)打破互斥条件:允许进程同时访问某些条件

(2)打破不可抢占的条件:允许进程强行从资源的占有者手中抢占资源

(3)打破占有申请条件:进程运行前一次性向系统申请它所需要的所有资源

(4)打破循环条件:把资源合理分配,不形成闭路

------------------------------------------------------------------------------------------------------------------------------------->

以上只是我的理解,如有错误,请指出,谢谢!

posted @ 2018-10-10 15:28  Aminue  阅读(119)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3