執行緒死鎖問題
不同的執行緒分別占用對方需要的同步資源不放棄,都在等待對方放棄自己需要的同步資源,就形成了執行緒的死鎖,
package com.cn.java2;
class A {
public synchronized void foo(B b) { //這里的同步鎖為 this:A類的物件a
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() { //同步監視器 a
System.out.println("進入了A類的last方法內部");
}
}
class B {
public synchronized void bar(A a) { //同步監視器:b
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方法內部"); //同步監視器:b
}
}
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();
new Thread(dl).start();
dl.init();
}
}
package com.cn.java2;
public class ThreadTest2 {
public static void main(String[] args) {
StringBuffer s1 = new StringBuffer();
StringBuffer s2 = new StringBuffer();
new Thread() {
@Override
public void run() {
synchronized (s1) {
s1.append("a");
s2.append("1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s2) {
s1.append("b");
s2.append("2");
System.out.println(s1);
System.out.println(s2);
}
}
}
}.start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (s2) {
s1.append("c");
s2.append("3");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s1) {
s1.append("d");
s2.append("4");
System.out.println(s1);
System.out.println(s2);
}
}
}
}).start();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/258654.html
標籤:其他
