过多同步可能导致死锁问题。
如下,a对象等待b对象执行完毕,而b对象等待a对象执行完毕,这样就会出现死锁问题。
下面的代码有几率产生死锁。
public class Test extends Object {
public static void main(String[] args) throws Exception {
A a = new A();
B b = new B();
MyThread myThread = new MyThread(a, b);
//下面两行代码如果调换位置,死锁发生的可能性会明显下降
//原因可能为调换位置后,线程start,会调用操作系统启动线程,耗费时间比较长,导致main主线程执行完成后myThread才开始执行
myThread.start();
b.cry(a);
}
}
class MyThread extends Thread {
private A a;
private B b;
public MyThread(A a, B b) {
this.a = a;
this.b = b;
}
@Override
public void run() {
a.cry(b);
}
}
class A {
synchronized void smile() {
System.out.println(Thread.currentThread().getName() + " " + this.getClass() + " 我笑了,你呢");
}
synchronized void cry(B b) {
System.out.println(Thread.currentThread().getName() + " " + this.getClass() + " 我哭了");
b.smile();
}
}
class B {
synchronized void smile() {
System.out.println(Thread.currentThread().getName() + " " + this.getClass() + " 我笑了,你呢");
}
synchronized void cry(A a) {
System.out.println(Thread.currentThread().getName() + " " + this.getClass() + " 我哭了");
a.smile();
}
}