多线程中的死锁

一、死锁:所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都无法向前推进。

二、如何避免死锁

1、加锁顺序(线程按照一定的顺序加锁)---------本例就是采用这种方法

2、加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁),例如本例中的线程,占了一个锁又再请求另一个锁。

package thread;

/**
 * 避免死锁
 * 获取锁的顺序
 * 核心所在:t1.join();
 * 把t1.join() 去掉就是demo01的死锁了
 *
 * Created by sxf on 2018/6/27.
 */
public class DeadLockDemo02 {

    private int flag = 1;
    private static Object o1 = new Object();
    private static Object o2 = new Object();

    public static void main(String[] args) {

        final Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
               money(1);
            }
        });
        t1.start();

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    t1.join(); //*核心所在****************************************************
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                money(0);
            }
        });
        t2.start();
    }

    public static void money(int flag) {
        System.out.println("flag:" + flag);
        if (flag == 1) {
            synchronized(o1) {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o2) {
                    System.out.println("1进来的");
                }
            }
        }

        if (flag == 0) {
            synchronized(o2) {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized(o1) {
                    System.out.println("0进来的");
                }
            }
        }
    }
}

运行结果:

flag:1

1进来的

flag:0

0进来的


猜你喜欢

转载自blog.csdn.net/qq_38369069/article/details/80836877