2015-11-07 58 views
0

假設有兩個線程A和B.有一個對象有兩個同步方法dothisOne和dothis兩個,它們應該在調用程序中按順序執行(dothisOne ---> dothisTwo)。兩個線程都必須遵循相同的調用順序(dothisOne ---> dothisTwo)。假設兩者都開始新鮮並且第一個線程A在執行dothisOne時鎖定對象。一旦它完成了dothisOne並且控制出來...... ThreadB有沒有可能啓動dothisOne(或)它是否100%保證線程A會爲dothisTwo?這個問題與實例方法有關。如果它是類方法(靜態),我相信threadA會去dothisTwo實例方法JAVA中的同步

回答

3

是否有機會ThreadB啓動dothisOne(或)是否100%保證線程A將爲dothisTwo?

根本沒有保證。我懷疑它是更有可能線程A將進入doThisTwo而不是,因爲基本上沒有什麼需要做退出顯示器和重新進入它之間 - 它不需要重新安排或任何東西。但是,不,它可能發生任何一種方式。

如果它是類方法(靜態),我相信的ThreadA會去dothisTwo

都能跟得上 - 同步不關心實例方法VS靜態方法。靜態和實例同步方法在不同的監視器中隱式地同步,但僅此而已。基本上,如果你想讓兩件事情作爲一個單元發生(就同步而言),你需要圍繞這對操作進行同步,而不是每個操作輪流進行同步。

+0

很高興知道。還有一點疑問:我們不能在靜態上下文中使用同步塊[synchronized(this){}],我們可以創建一個靜態變量myStatic並使用synchronized(myStatic)嗎?那會保證同步嗎? –

+0

@SrikanthPai:是的,只要兩個線程與同一個引用同步即可。就我個人而言,我嘗試避免在實例方法中使用'this'同步...我更喜歡創建僅*用於同步​​的對象,因爲這樣可以更容易推理它們,因爲知道只有*代碼可以訪問監視器是班級中的代碼。 –