線程鎖及線程鎖的做用

 什麼是線程鎖機制

  多線程能夠同時運行多個任務可是當多個線程同時訪問共享數據時,可能致使數據不一樣步,甚至錯誤!html

  so,不使用線程鎖, 可能致使錯誤python

在分佈式集羣系統的開發中,線程鎖每每並不能支持所有場景的使用,必須引入新的技術方案分佈式鎖。多線程

  線程鎖:你們都不陌生,主要用來給方法、代碼塊加鎖。當某個方法或者代碼塊使用鎖時,那麼在同一時刻至多僅有有一個線程在執行該段代碼。當有多個線程訪問同一對象的加鎖方法/代碼塊時,同一時間只有一個線程在執行,其他線程必需要等待當前線程執行完以後才能執行該代碼段。可是,其他線程是能夠訪問該對象中的非加鎖代碼塊的。分佈式

  進程鎖:也是爲了控制同一操做系統中多個進程訪問一個共享資源,只是由於程序的獨立性,各個進程是沒法控制其餘進程對資源的訪問的,可是可使用本地系統的信號量控制(操做系統基本知識)。post

  分佈式鎖:當多個進程不在同一個系統之中時,使用分佈式鎖控制多個進程對資源的訪問。ui

分佈式鎖究竟是什麼,怎麼實現?spa

  intsmaze說簡單點,實現分佈式鎖必需要依靠第三方存儲介質來存儲鎖的元數據等信息。好比分佈式集羣要操做某一行數據時,這個數據的流水號是惟一的,那麼咱們就把這個流水號做爲一把鎖的id,當某進程要操做該數據時,先去第三方存儲介質中看該鎖id是否存在,若是不存在,則將該鎖id寫入,而後執對該數據的操做;當其餘進程要訪問這個數據時,會先到第三方存儲介質中查看有沒有這個數據的鎖id,有的話就認爲這行數據目前已經有其餘進程在使用了,就會不斷地輪詢第三方存儲介質看其餘進程是否釋放掉該鎖;當進程操做完該數據後,該進程就到第三方存儲介質中把該鎖id刪除掉,這樣其餘輪詢的進程就能獲得對該鎖的控制。操作系統

  說了這麼多,再補充一點,線程鎖,進程鎖,分佈式鎖的做用都是同樣的,只是做用的範圍大小不一樣。範圍大小:分佈式鎖 > 進程鎖 > 線程鎖。能用線程鎖,進程鎖狀況下使用分佈式鎖也是能夠的,能用線程鎖的狀況下使用進程鎖也是能夠的。只是範圍越大技術複雜度就越大。線程

用法

#建立鎖 lock = threading.Lock() #鎖定 lock.acquire([timeout]) #釋放 lock.release()

優缺點

優勢:保證資源同步 
缺點:有等待確定會慢code

相關文章
相關標籤/搜索