应该同步的,通过synchronized调用即将程序交给了主线程,只有synchronized调用完毕才有可能返回调用线程,在被同步的metthodA中到用任何函数都应该是同步的。
解决方案 »
- 菜鸟求助
- 如何保证仅一个java应用程序实例?
- 一个难题。。。
- JavaSrcipt小白求助
- 数据库连接错误
- 请高手指点 100分送上 用jcombobox怎么能实现和IE地址栏一样的显示功能
- 我用JAVA做APPLICATION的时候,连接数据库,我怎么样才能把表中的信息现实在SWING中的TEXTAREA中啊???解决马上给分!!!!
- j2sdkee-1-3-1-win.exe哪里下载?
- 问一个弱问题
- 如何在jsp中用记事本打开文本文件
- croba问题,为何编译不出_xxxImplBase 文件?
- 请问:在applet中是否可以使用dbswing控件,应如何避免ie中出现的classdefnotfound错误?谢谢
望高手给一个准确的答案欢迎大家讨论,参入有分!
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.
当虚拟机调用已函数的methodA的时候,他回先检查这个函数是否是同步,
没有没有synchronized标识,如果有,那么他就必须首先得到触发该方法
的实例的lock,如果该实例对象被别的线程占用,并且加锁,该线程就要等待。
所以:MethodA显然是同步的。但MethodB,MethodC没有同步。
线程能够同时的调用它们