執行緒同步(一)

2021-09-08 02:29:28 字數 3112 閱讀 1631

一、鎖物件

示例**:

mylock.lock();//a reentrantlock object
try
final

這一結構確保任何時刻只有乙個執行緒進入臨界區。一旦乙個執行緒封鎖了鎖物件,其它任何執行緒都無法通過lock語句。當其它執行緒呼叫lock時,它們被阻塞,直到第乙個執行緒釋放鎖物件。注意:

1)此鎖物件是物件級的,鎖的是物件例項,

2)此鎖物件是可重入的,同一執行緒中可以lock一次,兩次,甚至更多,在同一執行緒中,如果lock了兩次,必須unlock兩次,其它執行緒才能再次訪問。

示例**:銀行轉賬的示例。**生成2個賬戶,每個賬戶1000元,要求2個賬戶同時隨機轉賬而不出錯。

銀行用bank類表示,裡面實現了轉賬功能和查詢總賬的功能,賬戶用accounts陣列表示。

程式主要由兩個工作執行緒完成,每個工作執行緒執行這樣的動作:向另乙個賬戶轉賬,然後列印出兩個賬戶的總額。(假設轉賬是免費的)

示例**(此**必然造成總額出錯):

/**
* 客戶測試**,測試兩個執行緒同時轉賬最終出錯。
* @author luhx
*
*/
public

class banktransfertest

}

/**

* 銀行類,實現轉賬功能和查詢總賬的功能
* @author luhx
*
*/
public

class bank ;

/**
* 轉賬
* @param from
* @param to
* @param money
*/
void transfermoney(int from, int to, int money)
/**
* 查詢總金額
* @return
*/
int gettotalmoney()
return sum;
}
}

/**
* 執行緒類,將轉賬動作繫結到工作執行緒中執行
* @author luhx
*
*/
public

class transferrunnable implements runnable

public

void run()

catch (interruptedexception e)
}
}
}

經過分析,我們得知,由於兩個執行緒同時對賬戶1和2進行訪問,必然存在衝突,因此需要同步,同步的方法很簡單,只需在動到兩賬戶的函式內加上鎖即可,重新修改bank類,然後再執行,發現總額總是2000,不再產生錯誤。

/**
* 銀行類,實現轉賬功能和查詢總賬的功能
* @author luhx
*
*/
public

class bank ;

//銀行鎖
private lock banklock;
private condition condition;
bank()
/**
* 轉賬
* @param from
* @param to
* @param money
*/
void transfermoney(int from, int to, int money) throws interruptedexception
finally
}
/**
* 查詢總金額
* @return
*/
int gettotalmoney()
return sum;
}
finally
}
}

使用物件鎖比較麻煩,需要比較多的額外**,可以用synchronized進行簡化,使用之重改bank類後如下所示

/**
* 銀行類,實現轉賬功能和查詢總賬的功能
* @author luhx
*
*/
public

class bank ;

/**
* 轉賬
* @param from
* @param to
* @param money
*/
public

synchronized

void transfermoney(int from, int to, int money) throws interruptedexception

/**
* 查詢總金額
* @return
*/
public

synchronized

int gettotalmoney()

return sum;
}
finally
}
}

執行緒同步(一)

執行緒同步 即當有乙個執行緒在對記憶體進行操作時,其他執行緒都不可以對這個記憶體位址進行操作,直到該執行緒完成操作,其他執行緒才能對該記憶體位址進行操作,而其他執行緒又處於等待狀態,實現執行緒同步的方法有很多,臨界區物件就是其中一種。臨界區 當兩個執行緒競爭同一資源時,如果對資源的訪問順序敏感,就稱...

Linux 執行緒同步(一)

執行緒為什麼要同步 1.共享資源,多個執行緒可以對共享資源操作 2.由於併發原因,執行緒操作共享資源操作順序不一樣,可能會造成髒資料 3.處理器對儲存器的操作一般不是原子操作。臨界區 critical section 臨界區為了保證在某一時刻只有乙個執行緒能訪問資料的簡便方法,在任意時刻只允許乙個執...

同步 執行緒同步

操作執行的先後順序。同步指兩個或兩個以上隨時間變化的量在變化過程中保持一定的相對關係。同步 英語 synchronization 指對在乙個系統中所發生的事件 event 之間進行協調,在時間上出現一致性與統一化的現象。在系統中進行同步,也被稱為及時 in time 同步化的 synchronous...