初學者談執行緒

2021-09-13 10:34:37 字數 918 閱讀 8127

隨手記錄一下,方便與我一樣的初學者理解執行緒。

執行緒,可以理解為程式的執行渠道。每多乙個執行緒,其實就多了乙個渠道。就像一條河一樣,我挖一條河道就是乙個執行緒,多條河道就是多條執行緒。那麼他的作用其實就是就是為了分擔壓力(應對高併發這種情況存在),就像河道一樣,河道越多,水就疏通的越快,壓力就越小。

那麼說一下執行緒安全,執行緒安全其實是對共享資源的安全保證,這樣說吧,我們的系統有乙個總體主存,而每乙個執行緒則有自己專屬的輔存,執行緒在對乙個物件進行操作時,它會把修改結果先寫到自己的輔存中,然後再提交給主存。而執行緒不安全的原因,就是乙個物件,它被多個執行緒呼叫,這個時候,可能會發生這種情況,執行緒1對乙個物件進行操作了,然後吧改變寫到輔存裡。然而,這個時候,硬體暫存器切換執行緒,然後執行緒2又操作這個物件,然後寫到輔存,寫到主存裡。這個時候,又切換到執行緒1,然後把執行緒1修改的物件寫到主存裡。這樣,在執行完畢後,我們只能看到執行緒1改變的結果,執行緒2的結果就這麼被覆蓋了。

那麼有哪些方式針可以改變這種狀況呢。明白執行緒安全其實是多個執行緒對乙個資源進行操作發生的問題,那麼我們可以對這個資源操作完直接改變到主存中,就不會出現這種情況。對共享的資源物件加上volatile關鍵字,就可以立刻寫入主存,解決問題。

當然我們也可以用鎖,必須得這個執行緒執行完畢後,別的執行緒才可以對這個資源進行操作,常用的有synchornized以及分布式鎖,但這樣效率就很低了,切換執行緒後,發現這個方法不能執行,卡殼,直到獲取到鎖,然後才能操作,挺慢的。

悲觀鎖,樂觀鎖也說一下吧。

悲觀鎖其實就是加鎖,我執行不完,所有人別執行都等我,在資料庫的操作語句在後方加乙個for update,只要執行不完,別的操作就會一直阻塞在此處。

樂觀鎖其實就是基於設計層面的,就像資料庫裡我新增乙個時間戳字段,只要這條記錄改變,時間戳也會發生改變,那麼在**裡執行時,我在修改前再查詢一下這個時間戳,與**中的時間戳進行對比,如果不相同的話,那麼在**中就可以阻塞,不讓他修改。

初學者談初學者學html

這是乙個段落。解釋一下就是 html 與 html 之間的文字是描述網頁。head 與 head 之間的文字是文件的元資料。title 與 之間的文字是文件的標題。body 與 body 之間的文字是可見的頁面內容,是文章的主體部分。h1 與 h1 之間的文字被顯示為乙個大標題。p 與 p 之間的文...

初學者mysql MySQL初學者使用指南

有很多朋友雖然安裝好了mysql但卻不知如何使用它。在這篇文章中我們就從連線mysql 修改密碼 增加使用者等方面來學習一些mysql的常用命令。一 連線mysql。1 例1 連線到本機上的mysql。首先在開啟dos視窗,然後進入目錄 mysqlbin,再鍵入命令mysql uroot p,回車後...

初學者 遞迴

program xuexi3 implicit none integer,external fact 呼叫函式需要寫external 待定 integer n write n read n write fact n stop endrecursive integer function fact n ...