執行緒的同步,死鎖

2021-08-22 18:04:42 字數 1306 閱讀 3234

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

「同」字從字⾯上容易理解為⼀起動作

其實不是,」同」字應是指協同、協助、互相配合。

例如:如程序、執行緒同步,可理解為程序或執行緒a和b⼀塊配合,a執⾏到⼀定程度 時要依靠b的某個結果,於是停下來,示意b運⾏;b依⾔執⾏,再將結果給 a;a再繼續操作。

沒有控制多個執行緒對同⼀資源的訪問,對資料造成破 壞,使得執行緒運⾏的結果不可預期。這種現象稱為「執行緒不安全」。

當多個執行緒⼏乎同時修改某⼀個共享資料的時候,需要進⾏同步控制

執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引⼊互 斥鎖。

互斥鎖為資源引⼊⼀個狀態:鎖定/⾮鎖定。

某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為「鎖定」,其他 執行緒不能更改;直到該執行緒釋放資源,將資源的狀態變成「⾮鎖定」,其他的 執行緒才能再次鎖定該資源。互斥鎖保證了每次只有⼀個執行緒進⾏寫⼊操作, 從⽽保證了多執行緒情況下資料的正確性。

threading模組中定義了lock類,可以⽅便的處理鎖定:

建立鎖 mutex = threading.lock()

鎖定 mutex.acquire([blocking])

釋放 mutex.release()

其中,鎖定⽅法acquire可以有⼀個blocking引數。

如果設定blocking為true,則當前執行緒會堵塞,直到獲取到這個鎖為⽌ (如果沒有指定,那麼預設為true) 如果設定blocking為false,則當前執行緒不會堵塞

當⼀個執行緒調⽤鎖的acquire()⽅法獲得鎖時,鎖就進⼊「locked」狀態。

每次只有⼀個執行緒可以獲得鎖。如果此時另⼀個執行緒試圖獲得這個鎖,該線 程就會變為「blocked」狀態,稱為「阻塞」,直到擁有鎖的執行緒調⽤鎖的 release()⽅法釋放鎖之後,鎖進⼊「unlocked」狀態。

執行緒排程程式從處於同步阻塞狀態的執行緒中選擇⼀個來獲得鎖,並使得該線 程進⼊運⾏(running)狀態。

鎖的好處:

確保了某段關鍵**只能由⼀個執行緒從頭到尾完整地執⾏

鎖的壞處:

阻⽌了多執行緒併發執⾏,包含鎖的某段**實際上只能以單執行緒模式執 ⾏,效率就⼤⼤地下降了 由於可以存在多個鎖,不同的執行緒持有不同的鎖,並試圖獲取對⽅持有 的鎖時,可能會造成死鎖

對於全域性變數,在多執行緒中要格外⼩⼼,否則容易造成資料錯亂的情況發⽣

在多執行緒開發中,全域性變數是多個執行緒都共享的資料,⽽區域性變數等是 各⾃執行緒的,是⾮共享的

程式設計時要盡量避免(銀⾏家演算法) 新增超時時間等

可以使⽤互斥鎖完成多個任務,有序的程序⼯作,這就是執行緒的同步

執行緒的同步和死鎖

同步與死鎖 需要了解 什麼情況下需要同步 實現資料共享的時候 同步怎麼實現 同步 塊或者同步方法解決 實現同步了有什麼弊端 效能和效率會降低 publicclass syncdemo1 publicclassthreaddemo02 classmyrunnable1implements runnab...

執行緒的同步與死鎖

在多執行緒中,同步與死鎖概念很重要,在本章中必須了解以下幾點 1 需要同步。2 如何實現同步,了解 即可。3 及實現同步後有哪些 並不要求可以完整編寫,但是概念必須清楚。以買火車票為例,不管多少地方可以買火車票,最終一趟列車的車票數量是固定的,如果把各個售票點理解為執行緒的話,則所有執行緒應該共同擁...

執行緒的同步與死鎖

1 執行緒同步 當有乙個執行緒在對記憶體進行操作時,其他執行緒都不可以對這個記憶體位址進行操作,直到該執行緒完成操作,其他執行緒才能對該記憶體位址進行操作,而其他執行緒又處於等待狀態。如果執行緒不同步,即在不同執行緒同時訪問同一資源的過程中就會出現問題。2 執行緒同步處理 關鍵是 鎖 使用synch...