同步語句塊
另外為了對一個類對象能同步方法你也可以在你的程序中將一條語句或代碼塊指定成synchronized這個功能非常強大由於你指定的是哪一特定對象受益於語句或代碼塊的同步而不只是包含一個同步方法的代碼的對象的同步這裡我們可以為了一個給定的語句塊對任何一對象設置一把鎖當針對一個給定的對象同步的塊正在執行時針對同一對象同步的其他代碼塊或方法不叫以執行為了同步一個語句你只需寫成
sychronized(theobject)
statement; //synchronized with respect to theobject
程序中當這個語句正在執行時針對對象thObject同步的其他語句或語句塊不可以執行當然當一條語句調用一個方法該方法又依次調用其他方法時仍然如此這裡這條語句同樣可以是個很好的在括號間的代碼塊這是很有用的成分當這個正在工作的代碼塊正在運行時我們可以鎖住一個特定的對象
為了看看在實際中如何使用讓我們對最後的例了建立修改版木為了支持多個賬戶讓我們增加銀行操作的復雜性為了擴展我們的例子處理多個賬戶我們只需要對main()做些改變為了保持輸出不太多我們將添加一個額外的賬戶但為了能處理任何數量我們將修改代碼
死鎖
由於實際上你可以在你的程序巾任何地方為特定的對象設置同步代碼塊有的非常令人討厭的出錯狀態叫做死鎖(deadlock)這包括在兩個線程間的相互依賴出現這種情況的一種情形是當一個針對一個給定的對象比如說是theObject的一個線程執行同步代碼然後需要針對另一個對象比如說是theObject執行包含代碼的另一個方法雖然在這件事發生前第二個線程theOtherObject執行一些同步代碼並需要執行包含對第一個對象theObject同步的代碼的方法這裡這種情況如下圖所示
[] [] [] [] [] [] [] [] []
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27750.html