談談自己對GO的RWMutex的理解

2021-10-08 12:20:38 字數 1215 閱讀 3010

rwmutex的特性就是支援併發讀。適用於讀多寫少的場景。

type rwmutex struct 

const rwmutexmaxreaders = 1 << 30

func (rw *rwmutex) lock() 

}

func (rw *rwmutex) unlock() 

// 釋放互斥鎖,其他寫鎖就可以競爭互斥鎖了

rw.w.unlock()

}

func (rw *rwmutex) rlock() 

...}

func (rw *rwmutex) runlock() 

...}func (rw *rwmutex) runlockslow(r int32)

}

獲取讀鎖的流程

readercount + 1

以readercount<0,判斷是否被寫鎖阻塞,是的話,當前goroutine進入休眠

釋放讀鎖的流程

readercount - 1

以readercount<0,判斷是否有寫鎖

沒有寫鎖的話,直接返回

有寫鎖的話,呼叫runlockslow方法,readerwait - 1

如果readerwait == 0, 說明當前goroutine是寫鎖等待的最後乙個讀鎖goroutine,需要喚醒寫鎖goroutine

獲取寫鎖的流程

先獲取互斥鎖

readercount - rwmutexmaxreaders,後續讀操作全部阻塞

readerwait += readercount,把當前正在執行讀操作的數量加到readerwait上

如果readerwait != 0 ,說明當前還有其他goroutine持有讀鎖,當前goroutine進入睡眠,等待喚醒

釋放寫鎖流程

readercount + rwmutexmaxreaders, 後續讀鎖不會阻塞

readercount代表之前被寫鎖阻塞的讀鎖goroutine個數,喚醒readercount個讀鎖goroutine

最後釋放互斥鎖 最後

rwmutex相對mutex,增加了讀鎖的控制,就**邏輯複雜度而言,rwmutex比mutex要簡單很多,對mutex的流程熟悉的話,很快就能掌握rwmutex的原理

談談自己對sql優化的理解

合理的使用快取來減少對資料庫的查詢。如利用mybatis的一級快取,來減少相同sql的查詢。不使用select from 得查詢,加大資料庫的壓力,使用什麼字段,返回什麼字段。避免使用not in 或 不等於的查詢,因為會查詢全表。我們自己寫的sql很清楚知道,返回的資料有多少。當我們只需要有乙個結...

談談自己對rest和RPC的理解

一 什麼是rest rest是一種架構風格,restful是遵循這種架構風格的應用程式或者設計。rest這種架構風格是美國乙個博士在他的博士 中提出來的,皆在於解決隨著網際網路的快速發展,傳統的軟體已經無法滿足在這個時代背景下人們需求。在這個新的時代下,在這個萬物互聯的時代下,網路和軟體這兩個曾經單...

何為SEO,談談自己對SEO的真實理解

關於seo的定義是沒有什麼好爭辯的,即search engine optimization,漢譯為搜尋引擎優化。大多數人會直接理解為針對關鍵詞排名進行的站內站外各種優化。這都是正確的,這裡就不重複了。實際上關於seo,站長們通常都有自己的態度與理解,本人也不例外,尤其是從事seo相關工作一段時間以後...