如何实现一个 timeout 的锁?

**题目来源:**网易

答案1:

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