gf框架之gmlock 記憶體鎖模組

2021-09-13 04:04:27 字數 4815 閱讀 4995

記憶體鎖。該模組包含兩個物件特性:

locker記憶體鎖,支援按照給定鍵名生成記憶體鎖,並支援try*lock鎖過期特性;

mutex對標準庫底層sync.mutex的封裝,增加了try*lock特性;

使用方式

import "gitee.com/johng/gf/g/os/gmlock"
使用場景

任何需要併發安全的場景,可以替代sync.mutex

需要使用try*lock的場景(不需要阻塞等待鎖釋放);

需要動態建立互斥鎖,或者需要維護大量動態鎖的場景;

}該示例中,模擬了同時開啟10個goroutine,但同一時刻只能有乙個goroutine獲得鎖,獲得鎖的goroutine執行1秒後退出,其他goroutine才能獲得鎖。

執行後,輸出結果為:

2018-10-15 23:57:28.295 9

2018-10-15 23:57:29.296 0

2018-10-15 23:57:30.296 1

2018-10-15 23:57:31.296 2

2018-10-15 23:57:32.296 3

2018-10-15 23:57:33.297 4

2018-10-15 23:57:34.297 5

2018-10-15 23:57:35.297 6

2018-10-15 23:57:36.298 7

2018-10-15 23:57:37.298 8

我們將以上的示例使用過期時間控制來實現。

}執行後,輸出結果為:

2018-10-15 23:59:14.663 9

2018-10-15 23:59:15.663 4

2018-10-15 23:59:16.663 0

2018-10-15 23:59:17.664 1

2018-10-15 23:59:18.664 2

2018-10-15 23:59:19.664 3

2018-10-15 23:59:20.664 6

2018-10-15 23:59:21.664 5

2018-10-15 23:59:22.665 7

2018-10-15 23:59:23.665 8

trylock方法是有返回值的,它表示用來嘗試獲取鎖,如果獲取成功,則返回true;如果獲取失敗(即鎖已被其他goroutine獲取),則返回false

}同理,在該示例中,同時也只有1個goroutine能獲得鎖,其他goroutine在trylock失敗便直接退出了。

執行後,輸出結果為:

2018-10-16 00:01:59.172 9

2018-10-16 00:01:59.172 false

2018-10-16 00:01:59.172 false

2018-10-16 00:01:59.172 false

2018-10-16 00:01:59.172 false

2018-10-16 00:01:59.172 false

2018-10-16 00:01:59.172 false

2018-10-16 00:01:59.172 false

2018-10-16 00:01:59.172 false

2018-10-16 00:01:59.176 false

該示例用來演示在複雜邏輯下的鎖機制處理情況。

)// 記憶體鎖 - 手動unlock與計時unlock衝突校驗

func main() ()

time.sleep(3*time.second)

// 這時再解鎖

gmlock.unlock(key)

// 注意3秒之後才會執行這一句

glog.println("unlock2")

// 阻塞程序

select{}

}執行後,輸出結果為:

2018-10-16 00:03:40.277 lock1

2018-10-16 00:03:40.279 unlock1

2018-10-16 00:03:40.279 lock2

2018-10-16 00:03:43.279 unlock2

2018-10-16 00:03:43.279 lock by goroutine

glog模組寫日誌檔案的時候有這麼乙個核心方法,我們拿來看一下(源**位於 /g/os/glog/glog_logger.go)。

// 這裡的寫鎖保證同一時刻只會寫入一行日誌,防止串日誌的情況

func (l *logger) print(std io.writer, s string)

writer := l.getwriter()

if writer == nil

}} else

// 是否允許輸出到標準輸出

if l.alsostdprint.val()

}

其中的:

gmlock.lock(key)

...gmlock.unlock(key)

便使用到了記憶體鎖的特性,其中的變數key表示的是日誌檔案的絕對路徑,當多個goroutine對同乙個日誌檔案進行寫入時,由gmlock.lock(key)來保證對該檔案的併發安全寫操作。

gf框架之分頁模組 一 基本介紹

分頁管理由gpage包實現,gpage提供了強大的動態分頁及靜態分頁功能,並且為開發者自定義分頁樣式提供了極高的靈活度。使用方式 import gitee.com johng gf g util gpage 方法列表 godoc.org github.com johng cn gf g util g...

108 周跳探測之GF

相比於mw組合探測周跳,gf更為簡單。geometry free組合,顧名思義,消去了與幾何相關的項 與頻率無關項 給出如下長度形式的相位觀測方程,相關符號含義見mw組合博文107 周跳探測之mw l 1 rho lambda 1 n 1 i 1 l 2 rho lambda 2 n 2 fraci...

gf框架之分頁模組 五 自定義分頁

由於分頁物件預定義的樣式比較有限,有的時候我們想自定義分頁的樣式 標籤輸出 由於分頁物件的的所有方法都是公開的,這便為開發者自定義分頁樣式提供了非常高的靈活度。開發者可以通過以下方式實現自定義分頁內容 推薦 對輸出內容進行正則匹配替換實現自定義 根據分頁物件公開的方法自行組織分頁內容實現自定義 也可...