java_多线程二之死锁

死锁
什么是死锁?

  • 不同的线程在等待根本不可能释放的锁,从而导致线程无法继续运行。通俗的讲,就像男女朋友之间冷战,你等着我道歉,我等着你道歉,造成冷战,最后分手。
    例子:
package Thread;

/**
 *
 * @author zjq
 */
public class lock_die implements Runnable {

    public String username;
    public Object lock1 = new Object();
    public Object lock2 = new Object();

    public void setFlag(String username) {
        this.username = username;
    }

    @Override
    public void run() {
        if (username.equals("a")) {
            synchronized (lock1) {             
                try {
                    System.out.println("username=" + username);   
                    Thread.sleep(1000);//第一处
                } catch (Exception e) {
                    e.printStackTrace();
                    
                }
                synchronized (lock2) {
                    System.out.println("lock1到lock2");
                }
            }
        }
        if (username.equals("b")) {
            synchronized (lock2) {
                try {
                    System.out.println("username=" + username);                   
                } catch (Exception e) {
                    e.printStackTrace();
                }

                synchronized (lock1) {
                    System.out.println("lock2到lock1");
                }
            }
        }

    }

    public static void main(String[] args) {
        try {
            lock_die lo = new lock_die();
            lo.setFlag("a");
            Thread a = new Thread(lo);
            a.start(); 
            Thread.sleep(100);//第二处
            lo.setFlag("b");
            Thread b = new Thread(lo);
            b.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

  • 运行结果
username=a
username=b

上边的两处sleep是关键,第一处是等待第二处睡眠进行完,以及b线程进入第一个锁持有lock2对象,自己持有lock1对象。第二处是阻止a和b线程的异步。若不加第二处sleep则username永远是b。

猜你喜欢

转载自blog.csdn.net/qq_39837953/article/details/84448357