过多同步可能导致死锁问题。

    如下,a对象等待b对象执行完毕,而b对象等待a对象执行完毕,这样就会出现死锁问题。

    下面的代码有几率产生死锁。

    1. public class Test extends Object {
    2. public static void main(String[] args) throws Exception {
    3. A a = new A();
    4. B b = new B();
    5. MyThread myThread = new MyThread(a, b);
    6. //下面两行代码如果调换位置,死锁发生的可能性会明显下降
    7. //原因可能为调换位置后,线程start,会调用操作系统启动线程,耗费时间比较长,导致main主线程执行完成后myThread才开始执行
    8. myThread.start();
    9. b.cry(a);
    10. }
    11. }
    12. class MyThread extends Thread {
    13. private A a;
    14. private B b;
    15. public MyThread(A a, B b) {
    16. this.a = a;
    17. this.b = b;
    18. }
    19. @Override
    20. public void run() {
    21. a.cry(b);
    22. }
    23. }
    24. class A {
    25. synchronized void smile() {
    26. System.out.println(Thread.currentThread().getName() + " " + this.getClass() + " 我笑了,你呢");
    27. }
    28. synchronized void cry(B b) {
    29. System.out.println(Thread.currentThread().getName() + " " + this.getClass() + " 我哭了");
    30. b.smile();
    31. }
    32. }
    33. class B {
    34. synchronized void smile() {
    35. System.out.println(Thread.currentThread().getName() + " " + this.getClass() + " 我笑了,你呢");
    36. }
    37. synchronized void cry(A a) {
    38. System.out.println(Thread.currentThread().getName() + " " + this.getClass() + " 我哭了");
    39. a.smile();
    40. }
    41. }