如何实现一个 timeout 的锁?

本文阅读 2 分钟
首页 golang 正文

题目序号:(665)

题目来源:网易

题目频次:1

答案1:(自由)

用 for 循环和 TryLock 实现。先记录开始的时间,用 for 循环判断是否超时,没有超时则反复尝试 TryLock,直到获取成功;如果超时直接返回失败。可这样有一个问题,高频的 CAS 自旋操作,如果失败的太多,会消耗大量的 CPU,我们需要进行优化,将 TryLock 的抢占实现分为两部分,一个是 fast path,另一个是竞争状态下的,后者的 CAS 操作很多,可以考虑减少 slow 方法的频率,例如调用 n 次 fast path 失败后,再调用一次整个 TryLock。我们还可以借鉴 TCP 重试机制进行优化,for 循环中的重试增加休眠时间,每次失败将休眠时间乘以一个系数,直到达到上限,减少自旋带来的性能损耗。

本文来自投稿,不代表本站立场,如若转载,请注明出处:
Golang Map 如何扩容
« 上一篇 09-17
go什么场景使用接口
下一篇 » 09-17

发表评论

发表评论