1. 程式人生 > >跟我學程式碼架構設計模式之--同步的引入

跟我學程式碼架構設計模式之--同步的引入

同步是什麼?為什麼要有同步?我來給你獨到的分析。

先來思考幾個相關的問題

# 計算機是用來幹什麼的?

答:幫我們解決對資料的計算和儲存的,計算機中的硬體和軟體都是為這一目的服務的!

# 計算機的最小執行單位是什麼?

答:CPU指令,組成格式為指令碼+運算元 ,有的指令沒有運算元,有的指令有運算元。

# 我們編制的上層程式的最小執行單位是什麼?

答:函式,函式也是我們指揮計算機幫我們對資料做計算和儲存的最小操作單位!

# 函式的本質分類?

CPU指令分為有運算元指令和無運算元指令,這裡我給函式劃分為有關聯資源的函式和無關聯資源的函式

有關聯資源的函式:函式的引數中,有傳引用或者指標的資料。更抽象點說就是函式關聯了外部資源,這個外部資源可以是堆區的資料、常量區的靜態資料、甚至是檔案、本地磁碟的檔案、網路上的其他機器上的檔案等等。

無關聯資源的函式:函式的引數全是傳值形式的,函式操作的資源都是自包含的--都在當前函式的棧幀當中!

# 執行緒是什麼?

出乎你的意料,我對執行緒的定義很簡單---執行緒就是幹活的!除了可以執行一系列的函式,沒有什麼其他可說的!下文中的分析中關於執行緒部分,你就單純的理解為是一個獨立的幹活的CPU就行~

同步的引入

# 同步涉及到的角色

函式、函式關聯的資源、執行緒、鎖

# 我們對正確操作的預期

對於一個函式,不管我們執行一次還是執行多次,執行多次的時候不管是分給一個執行緒執行,還是分給多個執行緒執行,我們最終想要的結果是可以預期的,不會產生二義性!簡單的說 即: 我們的預期結果只和函式執行的次數有關,和有幾個執行緒執行無關!

或:一個函式執行多次,多執行緒執行得到的結果和單執行緒執行同樣次數得到的結果是一致的!:一個函式並行執行多次的結果應該和順序執行多次的結果是一致的! 我們下面要講的同步都是在這個正確的預期下才有意義,假如你們有這個預期,那麼同步就無從談起了!

#  問題的產生

對於無操作資源的函式執行10次,一個執行緒執行10次和分多個執行緒共執行10次,最終產生的結果肯定是相同的!是肯定會滿足我們對正確操作的預期的,因為函式執行所需的資源都是自包含的,都在棧幀中。

對於有關聯資源的函式執行10次,單執行緒執行10次和多執行緒共執行10次的結果可能會是不同的!舉個例子:一個函式的操作是取一個整形靜態變數的當前值然後+1操作,初值為0的情況下,這個函式執行10次,我們預期這個變數的值應該為10,單執行緒的情況下執行10次,最終結果肯定滿足我們的預期,多執行緒的情況下,卻有可能得到結果是小於10的情況,因為有可能多個執行緒取當前值的時候取到的是同一個值,最後+1的時候實際上就加少了!

# 問題的解決思路

通過上面的問題,多執行緒環境下函式執行結果和我們的預期不一致的現象,我們可以可以分析出一個公共的原因:沒有控制好函式執行的順序! 只有控制好了順序,才會滿足函式在多執行緒執行10次的結果和順序執行10次的結果一致!要想達到一致,要想結果符合預期,我們必須要設法讓多個執行緒在訪問關鍵資源的時候排隊!這就是同步!!!我們可以讓多執行緒訪問公共資源的時候引入一個“看門人”,看門人確保訪問資源的時候一個接一個的排隊按順序訪問,不能一擁而上!這就是----鎖保護機制!!!

(完)