一个简单的class:
  Class  Test(){
     public synchronized static void A(){
                B();
          ...........
....................
  
     }
  
     private synchronized  static void B(){
          ...................
     }
  
}在如上类中,如果调用A()方法,那么加的是对象锁,那么A()中调用B()函数是否能执行。
书上说对象锁中其他的synchronized函数将无法被调用, 而我的测试代码似乎可以执行,难以理解?求解答!

解决方案 »

  1.   

    A可以调用B,因为能进入了A就说明拥有锁权,在A中可以多次再申请锁权的
    书中的意思是,一个线程执行A时,另一个线程是不能执行B,或者反过来一个线程执行B时,另一个线程不能执行A,但是对一个同一个线程,在A中调用B,不存在排他问题,因为线程在调用A时,其他线程没法调用B
      

  2.   

    是否可以理解为在同个线程内,synchronized 函数都可以调用,只是如果该线程没进行解锁的话 别的线程是调用不了。而一个线程中加了几次锁就要解几次锁 别的线程才能用?
      

  3.   

    楼主举得例子是类锁,该方法已经声明了static,对于此例,同一进程可以A()调B()。如果是不同对象创建的多个进程,可以同时调用同一加锁非static方法。建议楼主多看看类锁与对象锁的区别。注意:只有共享数据,才有加锁的必要,如果只共享方法而不共享数据,就没必要加锁。