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)打破循环条件:把资源合理分配,不形成闭路
------------------------------------------------------------------------------------------------------------------------------------->
以上只是我的理解,如有错误,请指出,谢谢!
浙公网安备 33010602011771号