过多同步可能导致死锁问题。
如下,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;}@Overridepublic 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();}}
