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相關工作一段時間以後...