1. 程式人生 > >執行緒同步和執行緒安全

執行緒同步和執行緒安全

執行緒同步

同步就是協同步調,按預定的先後次序進行執行。如:你說完,我再說。

“同”字從字面上容易理解為一起動作,其實不是,“同”字應是指協同、協助、互相配合。 如程序、執行緒同步,可理解為程序或執行緒A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下來,示意B執行;B依言執行,再將結果給A;A再繼續操作。 所謂同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回,同時其它執行緒也不能呼叫這個方法。按照這個定義,其實絕大多數函式都是同步呼叫(例如sin, isdigit等)。但是一般而言,我們在說同步、非同步的時候,特指那些需要其他部件協作或者需要一定時間完成的任務。例如Window API函式SendMessage。該函式傳送一個訊息給某個視窗,在對方處理完訊息之前,這個函式不返回。當對方處理完畢以後,該函式才把訊息處理函式所返回的LRESULT值返回給呼叫者。

在多執行緒程式設計裡面,一些敏感資料不允許被多個執行緒同時訪問,此時就使用同步訪問技術,保證資料在任何時刻,最多有一個執行緒訪問,以保證資料的完整性。

java中的同步【和C#差不多】

class MyTest{
 
private static final Object lock=new Object();
 
public static synchronized void test(){
//同步的方法
}
 
public void test2(){
synchronized(lock){
//方法級同步,也可以使用this實現物件級同步
}
}
 
}


執行緒同步的方式和機制

臨界區、互斥量、事件、訊號量四種方式 臨界區(Critical Section)、互斥量(Mutex)、訊號量(Semaphore)、事件(Event)的區別 1、臨界區:通過對多執行緒的序列化來訪問公共資源或一段程式碼,速度快,適合控制資料訪問。在任意時刻只允許一個執行緒對共享資源進行訪問,如果有多個執行緒試圖訪問公共資源,那麼在有一個執行緒進入後,其他試圖訪問公共資源的執行緒將被掛起,並一直等到進入臨界區的執行緒離開,臨界區在被釋放後,其他執行緒才可以搶佔。 2、互斥量:採用互斥物件機制。 只有擁有互斥物件的執行緒才有訪問公共資源的許可權,因為互斥物件只有一個,所以能保證公共資源不會同時被多個執行緒訪問。互斥不僅能實現同一應用程式的公共資源安全共享,還能實現不同應用程式的公共資源安全共享 3、訊號量:它允許多個執行緒在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大執行緒數目 4、事 件: 通過通知操作的方式來保持執行緒的同步,還可以方便實現對多個執行緒的優先順序比較的操作

執行緒安全

比如一個 ArrayList 類,在新增一個元素的時候,它可能會有兩步來完成: 1. 在 Items[Size] 的位置存放此元素; 2. 增大 Size 的值。 在單執行緒執行的情況下,如果 Size = 0,新增一個元素後,此元素在位置 0,而且 Size=1;而如果是在多執行緒情況下,比如有兩個執行緒,執行緒 A 先將元素1存放在位置 0。但是此時 CPU 排程執行緒A暫停,執行緒 B 得到執行的機會。執行緒B向此 ArrayList 新增元素2,因為此時 Size 仍然等於 0 (注意,我們假設的是新增一個元素是要兩個步驟,而執行緒A僅僅完成了步驟1),所以執行緒B也將元素存放在位置0。然後執行緒A和執行緒B都繼續執行,都增加 Size 的值,結果Size等於2。

那好,我們來看看 ArrayList 的情況,期望的元素應該有2個,而 實際元素是在0位置,造成丟失元素,而且Size 等於 2。這就是“執行緒不安全”了。

如果你的程式碼所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。 或者說:一個類或者程式所提供的介面對於執行緒來說是原子操作或者多個執行緒之間的切換不會導致該介面的執行結果存在二義性,也就是說我們不用考慮同步的問題。


執行緒安全問題都是由全域性變數及靜態變數引起的。
若每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮執行緒同步,否則的話就可能影響執行緒安全。

百度百科

http://baike.baidu.com/link?url=tV-sPHW5JV51pun21J_7eKe6qAhOm7d40B_uD6XgmF6JOopxTZge9ZByBXWuq_shd8emh8hT9mpV0qp9w56WjK

http://baike.baidu.com/link?url=KEmbMcWMnWBTA0JTOYa8CvKJ-qjCAkQsAdYF1xqLRLVWi20xL9C-02E35ygH4dn-DybnhXlLEzBbzvwmbq9olq