java线程死锁问题
演示线程死锁问题:
同一类中
public class ThreadTest {
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();
}
}
执行结果:
不同类中
class A {
public synchronized void foo(B b) { //同步监视器: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类的对象:a
System.out.println("进入了A类的last方法内部");
}
}
class B {
public synchronized void foo(A a) { //同步监视器:b
System.out.println("当前线程名:" + Thread.currentThread().getName() + "进入了B实例的foo方法"); //步骤二
try {
Thread.sleep(200);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("当前线程名:" + Thread.currentThread().getName() + "企图调用A实例的last方法"); //步骤四
a.last();
}
public synchronized void last() { //b
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(b);
System.out.println("进入了主线程之后");
}
public void run() {
Thread.currentThread().setName("副线程");
b.bar(a);
System.out.println("进入了副线程之后")
}
public static void main(String[] args) {
DeadLock dl = new DeadLock();
new Thread(dl).start();
dl.init();
}
}
结果如下: