Discuss / Java / 死锁练习

死锁练习

Topic source

Junes_99994

#1 Created at ... [Delete] [Delete and Lock User]

public class Main {

    static final Object[] LOCKs = { new Object(), new Object(), new Object(), new Object() };

    public static void main(String[] args) {

        new MyThread(1, LOCKs, true, 2).start();

        new MyThread(2, LOCKs, false, 3).start();

    }

}

class MyThread extends Thread {

    private String tName;

    private boolean dir;

    private Object[] lockArr;

    private int locknum;

    public MyThread(Object tName, Object[] lockArr, boolean dir, int locknum) {

        this.tName = this.getClass().getSimpleName() + tName.toString();

        this.dir = dir;

        this.lockArr = lockArr;

        this.locknum = locknum;

    }

    public void syncIterate(int lockIndex) {

        Object lock;

        if (lockIndex < lockArr.length && lockIndex >= 0 && locknum > 0) {

            lock = lockArr[lockIndex];

            locknum--;

        } else {

            return;

        }

        System.out.println(tName + ": try get lock " + (lockIndex + 1) + " ...");

        synchronized (lock) {

            System.out.println(tName + ": lock " + (lockIndex + 1) + " got.");

            try {

                Thread.sleep(300 + (int) (Math.random() * 1000));

            } catch (InterruptedException e) {

                System.out.println(e);

            }

            syncIterate(lockIndex + (this.dir ? 1 : -1));

            System.out.println(tName + ": lock " + (lockIndex + 1) + " releasing.");

        }

    }

    public void run() {

        syncIterate(dir ? 0 : lockArr.length - 1);

    }

}

Junes_99994

#2 Created at ... [Delete] [Delete and Lock User]

1.      死锁就像两个人A和B分别从正反两个方向过两截独木桥1-2

a)      当A和B分别占用独木桥的1或2,这时必在独木桥中间相遇

b)     这时,除非一方主动回退,否则两者将死锁在桥中央

这也是天龙八部中的经典桥段

2.      如果一个系统中两个线程反向请求两个独占的资源,且同时占有两个资源后才愿意释放,那就可能发生死锁。


  • 1

Reply