应该同步的,通过synchronized调用即将程序交给了主线程,只有synchronized调用完毕才有可能返回调用线程,在被同步的metthodA中到用任何函数都应该是同步的。

解决方案 »

  1.   

    恩,methodB跟C都不同步,所以methodA执行过程中,当进入methodB() 或methodC(),线程是不一致的!
      

  2.   

    如果A不能保持一致,那岂不是必须经A调用的所有的方法都给synchronized?到底MethodA能不能被打断呢?
    望高手给一个准确的答案欢迎大家讨论,参入有分!
      

  3.   

    Method A calls Method B, and Method A is synchronized.
    Method B is not synchronized.
    Notice, Method B could be invoked by itself as well, meaning it does not has to be invoked by Method A.
    现有Thread1 and Thread2.
    case 1:
    Thread1 calls Method A, Thread2 calls Method A too.
    when the stack trace goes to Method B, it's still synchronized. In other words, if Thread2 先call Method A, Thread2必须等到Thread1完成Method B and finish the rest of Method A.所以说Method B也是Thread save的。
    case 2:
    Thread1 calls Method A, Thread2 calls Method B.
    Thread1 then moves to Method B, but still holding the lock. Thread2 calls Method B, 但是不需要得到lock先,所以,Thread1 and Thread2 are both in Method B.所以说,Method B不是Thread Save.
    事务要分情况,如果,method B只有被method A 调用,那麽就不需要加synchronized.如果method B不是critical section,也不要加synchronized keyword.当synchronized用得多了,程序会跑得慢。这也就是为什么jdk1.3后推荐使用ArrayList而不是Vector, 推荐使用HashMap而不是HashTable.
      

  4.   

    hayai(生命树)说得挺正确的,我在补充一下它的实现:
    当虚拟机调用已函数的methodA的时候,他回先检查这个函数是否是同步,
    没有没有synchronized标识,如果有,那么他就必须首先得到触发该方法
    的实例的lock,如果该实例对象被别的线程占用,并且加锁,该线程就要等待。
    所以:MethodA显然是同步的。但MethodB,MethodC没有同步。
    线程能够同时的调用它们