一个死锁的例子

先举个栗子。

/**
 * Created by Benjamin on 07/30/030.
 */
public class TestDeadLock implements Runnable {
    public int    flag = 1;
    static Object o1   = new Object(), o2 = new Object();

    @Override
    public void run() {
        System.out.println("flag = " + flag);
        if (flag==1){
            synchronized (o1) {
                try {
                    Thread.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                synchronized (o2){
                    System.out.println("1");
                }
            }
        }

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

    public static void main(String[] args) {
        TestDeadLock t1 = new TestDeadLock();
        TestDeadLock t2 = new TestDeadLock();
        t1.flag = 1;
        t2.flag = 0;
        new Thread(t1).start();
        new Thread(t2).start();
    }
}
产生死锁的原因主要是:
  • 系统资源不足
  • 资源分配不当
  • 推进顺序不合适
产生死锁的四个必要条件:
  • 互斥:一个资源每次只能被一个进程使用
  • 资源保持:一个进程被阻塞时,不释放已有资源
  • 不可抢占:正在使用的资源不能被剥夺
  • 循环等待:循环等待未被分配的资源
例子死锁的原因:

静态对象o1和o2是类的资源。当flag=1的线程请求到o1资源时,再申请资源o2时,o2资源已经被flag=0的线程占有,并且后者需要申请资源o1才能继续执行。这样,二者就形成了相互等待的情形,故而形成死锁。

你可能感兴趣的:(一个死锁的例子)