多線程編程過程中鎖運用不好,會產生死鎖問題,先自己寫了個死鎖產生的案例,可以幫助初學者去理解死鎖
/**
* 模擬死鎖問題
* 兩個線程窗口1先獲取object鎖,在獲取this鎖
* 窗口2先獲得this鎖,在獲取object鎖
*/
public class DeadLockDemo implements Runnable {
private int count = 100;
boolean flag = true;
// object鎖
Object object = new Object();
@Override
public void run() {
if (flag) {
while (count > 0) {
synchronized (object) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("窗口1準備售票");
saleTicket();
}
}
} else {
System.out.println("窗口2準備售票");
while (count > 0) {
saleTicket();
}
}
}
private synchronized void saleTicket() {
synchronized (object) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (count > 0) {
System.out.println(Thread.currentThread() + ":窗口售出的第:" + (100 - count + 1) + "張票");
count--;
System.out.println("剩餘票數:" + count);
}
}
}
public static void main(String[] args) {
DeadLockDemo deadLockDemo = new DeadLockDemo();
new Thread(deadLockDemo, "窗口1").start();
try {
Thread.sleep(40);
deadLockDemo.flag = false;
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(deadLockDemo, "窗口2").start();
}
}