大多數應用程序需要線程相互通信來同步它們的動作。在Java程序中,實現同步的最簡單方法是鎖定Java線程。為了防止同時訪問資源,線程可以在使用資源之前和之後鎖定和解鎖資源。想象壹下鎖上復印機。任何時候都只有壹個員工有鑰匙。如果沒有鑰匙,復印機就無法使用。
給變量賦予Java多線程鎖,使得Java線程能夠快速方便地進行通信和同步。如果妳鎖定壹個對象,妳可以知道沒有其他線程可以訪問它。即使在搶先模式下,其他線程也不能訪問它,直到被鎖定的線程醒來完成它的工作並解鎖它。那些試圖訪問鎖定對象的線程通常會進入睡眠狀態,直到被鎖定的線程將其解鎖。壹旦鎖被打開,這些休眠的進程將被喚醒並移動到就緒隊列。
在Java編程中,所有對象都有鎖,線程可以使用synchronized關鍵字來獲取鎖。在任何時候,給定類的實例方法或同步代碼塊只能由壹個線程執行。這是因為代碼需要在執行前獲得對象的Java多線程鎖。繼續我們關於復印機的比喻。為了避免復制沖突,我們可以簡單地同步復制資源,如下所示。代碼示例:任何時候都只允許壹個雇員使用副本資源。方法(在Copier對象中)用於修改復印機的狀態。這種方法就是同步方法。只有壹個線程可以執行COPIER對象中的同步代碼,所以那些需要使用Copier對象的員工必須排隊等候。
班級復印機{
公共同步無效制作副本(文檔內部副本){
//壹次只有壹個線程執行此操作
}
公共void loadPaper() {
//多個線程可以同時訪問它!
同步(這){
//壹次只有壹個線程訪問它
//隨意使用共享資源覆蓋成員等
細粒度Java多線程鎖
在對象級使用鎖通常是壹種粗略的方法。為什麽要鎖定整個對象,不允許其他線程短時間使用對象中的其他同步方法來訪問共享資源?如果壹個對象有多個資源,沒有必要為了讓壹個線程使用其中的壹些資源而鎖定所有線程。因為每個對象都有Java多線程鎖,所以可以使用虛擬對象來鎖定它們,如下所示。
類FineGrainLock {
my member class x y;
Object xlock = new Object()ylock = new Object();
public void foo() {
同步(xlock) {
//在這裏訪問x
}
//在這裏做壹些事情,但是不要使用共享資源
同步(ylock) {
//在此訪問y
}
}
公共無效欄(){
同步(這){
//在這裏訪問x和y
}
//在這裏做壹些事情,但是不要使用共享資源
}
}
Lishi Xinzhi/Article/program/Java/gj/201311/27267