你的頭腦中需要保持清醒區分擁有你在類定義中聲明成synchronised實例方法的對象和可以用它們執行的線程在了個線程和myClass類的兩個對象間的假設關系在下圖中說明
圖中箭頭上的數字表示事件的次序No!表示線程需要等到方法被解鎖才能執行當obj中methodl()正執行時同一對象的method()不能被執行一個對象的這兩個實例方法的同步提供了同一象的保護等級因為在任問給定時刻只有一個同步方法才能與對象中的數據相關
盡管如此當每個對象啟動同步的實例方法時它獨立於任何其他對象當一個線程對一個對象執行同步方法時確保在涉及到該對象同步方法范圍內獨占地訪問盡管另一個線程對不同對象仍能調用相同的方法當對obj止執行method()方法時不妨礙其他線程對obj執行method ()方法而且如果一個對象中有方法沒被聲明成synchronized例如obj中的rnethod()任何線程可以在任何時刻調用無論對象中仟一同步方法是如何聲明的
如果你在一個類中將同步應用成static方法這個類中在任一時刻只能有一個static方法被執行這是每一類的同步而且這個類的鎖獨立於任們這個類的對象的鎖
你需要理解的一個重要原則是在代表線程的一個類對象中惟一有必要成為一個線程的一部分的方法是run()方法對同一類對象的其他為一法如果直接或間接被run()調用才作為線程的一部分對一個對象在run()中直接或間接被調用的所有方法都是同一線程的一部分但明顯地它們不必是同一Thread對象的方法它們的確是屬於任何其他對象的方法包括擁有自己run()方法的其他Thread對象
[] [] [] [] [] [] [] [] []
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27747.html