為什麼需要線程同步? 同步就是協同步調,按預定的先後次序進行運行。如:你說完,我再說而並非一起動作。“同”字應是指協同、協助、互相配合。 如進程、線程同步,可理解為進程或線程A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下來,示意B運行;B依言執行,再將結果給A;A再繼續操作。 所謂同 ...
為什麼需要線程同步?
同步就是協同步調,按預定的先後次序進行運行。如:你說完,我再說而並非一起動作。“同”字應是指協同、協助、互相配合。 如進程、線程同步,可理解為進程或線程A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下來,示意B運行;B依言執行,再將結果給A;A再繼續操作。 所謂同步,就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回,同時其它線程也不能調用這個方法。按照這個定義,其實絕大多數函數都是同步調用(例如sin, isdigit等)。但是一般而言,我們在說同步、非同步的時候,特指那些需要其他部件協作或者需要一定時間完成的任務。例如Window API函數SendMessage。該函數發送一個消息給某個視窗,在對方處理完消息之前,這個函數不返回。當對方處理完畢以後,該函數才把消息處理函數所返回的LRESULT值返回給調用者。 在一般情況下,創建一個線程是不能提高程式的執行效率的,所以要創建多個線程。但是多個線程同時運行的時候可能調用線程函數,在多個線程同時對同一個記憶體地址進行寫入,由於CPU時間調度上的問題,寫入數據會被多次的覆蓋,所以就要使線程同步。 線程同步:即當有一個線程在對記憶體進行操作時,其他線程都不可以對這個記憶體地址進行操作,直到該線程完成操作, 其他線程才能對該記憶體地址進行操作,而其他線程又處於等待狀態,目前實現線程同步的方法有很多,臨界區對象就是其中一種。 在多線程編程裡面,一些敏感數據不允許被多個線程同時訪問,此時就使用同步訪問技術,保證數據在任何時刻,最多有一個線程訪問,以保證數據的完整性。 比如同一個銀行賬戶被兩個人消費,這兩個人不能同時去用這個銀行卡去付款,因為銀行卡的餘額有限,必須確認一次消費完成後確認此銀行卡的餘額還可以足夠支付下一筆消費。賬戶內的餘額相當於cpu資源,而兩筆消費相當於兩個線程,此時兩個線程是不能同時去使用cpu資源的。 線程同步的操作方法: synchronized程式塊 synchronized方法 synchronized方法: public synchronized run(){ } 即線上程對象的 run()方法前加上關鍵字synchronized,表示該方法是原子性的,不允許兩個線程併發執行,當一個線程的實例對象去執行該方法時,會對當前線程對象加一個同步鎖,等它執行完任務後,在把這把鎖交給另一個需要訪問這個資源的線程。
兩個線程同時使用cpu資源,會造成一些麻煩,此時應給t1線程一把鎖,給runnable 對象加上同步鎖,不要允許t2線程此時運行直到t1線程完成其工作。
此處yield()方法執行了但沒有起作用。
synchronized程式塊:
持有鎖的線程以下情況會釋放鎖:
執行完同步代碼塊;
執行同步代碼塊的過程中發生異常導致線程終止;
執行了鎖所屬對象的wait()方法。
註意:yield()方法和sleep()方法都不會釋放鎖。
如有不對之處望指正,謝謝