美文网首页程序员
你不知道什么是死锁?

你不知道什么是死锁?

作者: 码上人生 | 来源:发表于2017-03-15 20:20 被阅读0次

    当两个线程相互等待对象释放同步监视器时就会发生死锁,一旦出现死锁,整个程序既不会发生任何异常,也不会给任何提示,只是所有线程处于阻塞状态,无法继续,代码如下:

    package com.eduask.java.thread.deadlock;

    class A

    {

    public synchronized void foo( B b )

    {

    System.out.println("当前线程名: " + Thread.currentThread().getName()

    + " 进入了A实例的foo()方法" );    // ①

    try

    {

    Thread.sleep(200);

    }

    catch (InterruptedException ex)

    {

    ex.printStackTrace();

    }

    System.out.println("当前线程名: " + Thread.currentThread().getName()

    + " 企图调用B实例的last()方法");    // ③

    b.last();

    }

    public synchronized void last()

    {

    System.out.println("进入了A类的last()方法内部");

    }

    }

    class B

    {

    public synchronized void bar( A a )

    {

    System.out.println("当前线程名: " + Thread.currentThread().getName()

    + " 进入了B实例的bar()方法" );  // ②

    try

    {

    Thread.sleep(200);

    }

    catch (InterruptedException ex)

    {

    ex.printStackTrace();

    }

    System.out.println("当前线程名: " + Thread.currentThread().getName()

    + " 企图调用A实例的last()方法");  // ④

    a.last();

    }

    public synchronized void last()

    {

    System.out.println("进入了B类的last()方法内部");

    }

    }

    public class DeadLock implements Runnable

    {

    A a = new A();

    B b = new B();

    public void init()

    {

    Thread.currentThread().setName("主线程");

    // 调用a对象的foo方法

    a.foo(b);

    System.out.println("进入了主线程之后");

    }

    public void run()

    {

    Thread.currentThread().setName("副线程");

    // 调用b对象的bar方法

    b.bar(a);

    System.out.println("进入了副线程之后");

    }

    public static void main(String[] args)

    {

    DeadLock dl = new DeadLock();

    // 以dl为target启动新线程

    new Thread(dl).start();

    // 调用init()方法

    dl.init();

    }

    }

    运行结果如下:

    相关文章

      网友评论

        本文标题:你不知道什么是死锁?

        本文链接:https://www.haomeiwen.com/subject/msjrnttx.html