1. 程式人生 > >java多執行緒快速入門(十三)

java多執行緒快速入門(十三)

死鎖產生的原因(必須有兩個執行緒、必須有多個鎖、鎖之間必須有引用的過程)

package com.cppdy;

class MyThread9 implements Runnable {

    private Integer ticketCount = 100;
    private Object ob = new Object();
    public boolean falg = true;

    @Override
    public void run() {
        if (falg) {
            synchronized (ob) {
                
while (ticketCount > 0) { try { Thread.sleep(50); } catch (Exception e) { e.printStackTrace(); } synchronized (this) { System.out .println(Thread.currentThread().getName()
+ "賣出了第:" + (100 - ticketCount + 1) + "張票。"); ticketCount--; } } } } else { while (ticketCount > 0) { sale(); } } } public synchronized void sale() { synchronized
(ob) { if (ticketCount > 0) { try { Thread.sleep(50); } catch (Exception e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "賣出了第:" + (100 - ticketCount + 1) + "張票。"); ticketCount--; } } } } public class ThreadDemo9 { public static void main(String[] args) throws Exception { MyThread9 mt = new MyThread9(); Thread thread1 = new Thread(mt, "視窗1"); Thread thread2 = new Thread(mt, "視窗2"); thread1.start(); Thread.sleep(30); mt.falg = false; thread2.start(); } }

T1一直等待T2釋放this鎖

T2又一直等待T1釋放ob鎖