Go 中通过 Deadline 获取锁
Go 中,sync.Mutex 类型仅提供 Lock() 和 Unlock() 方法。对于应在截止日期内尝试获取锁或可能立即中止的情况,没有内置解决方案。
建议的解决方案:通道作为互斥体
另一种方法是使用缓冲区大小为 1 的通道来模拟互斥体。通过发送和接收单个空结构体值 (struct{}{}),可以执行锁定和解锁操作。
Lock:
<code class="go">l := make(chan struct{}, 1) l <- struct{}{}</code>
解锁:
<code class="go"><-l</code>
尝试锁定:
<code class="go">select { case l <- struct{}{}: // lock acquired <-l default: // lock not acquired }</code>
尝试超时锁定:
<code class="go">select { case l <- struct{}{}: // lock acquired <-l case <-time.After(time.Minute): // lock not acquired }</code>
在提供的示例中,假设 s.someObj 是从键到值的映射。
示例 1:延迟敏感代码的 LockBefore()
<code class="go">// DoTheThing locks before performing expensive computations. func (s *RPCService) DoTheThing(ctx context.Context, ...) ... { l := make(chan struct{}, 1) select { case l <- struct{}{}: defer <-l ... expensive computation based on internal state ... default: return s.cheapCachedResponse[req.Parameter] } }</code>
示例 2:用于更新统计信息的 TryLock()
<code class="go">// updateObjStats attempts to lock and update stats. func (s *StatsObject) updateObjStats(key, value interface{}) { l := make(chan struct{}, 1) select { case l <- struct{}{}: defer <-l ... update stats ... ... fill in s.cheapCachedResponse ... default: // skip locked object } } // UpdateStats attempts to lock and update stats for all objects. func (s *StatsObject) UpdateStats() { s.someObj.Range(s.updateObjStats) }</code>
以上是Go中如何获取有期限的锁?的详细内容。更多信息请关注PHP中文网其他相关文章!