我想用Redis来实现分布式锁。我用RedLock.net nuget软件包来做这个。但是线程能够获得锁,即使另一个线程已经获得了锁。
下面是示例代码:
public void Demo(RedLockFactory redLockFactory)
{
Parallel.For(0, 5, x =>
{
TimeSpan expiry = TimeSpan.FromSeconds(30);
var wait = TimeSpan.FromSeconds(10);
var retry = TimeSpan.FromSeconds(1);
string user = $"User:{x}";
using (var redLock = redLockFactory.CreateLock(resource, expiry, wait, retry))
{
// make sure we got the lock
if (redLock.IsAcquired)
{
Console.WriteLine($"{user} acquired lock at {DateTimeOffset.Now.ToString("dd-MM-yyyy HH:mm:ss")}.");
}
else
{
Console.WriteLine($"{user} didn't get the lock.");
}
}
});
}这是我的演示的输出
User:4 acquired lock at 06-10-2020 09:24:34.
User:2 acquired lock at 06-10-2020 09:24:34.
User:1 acquired lock at 06-10-2020 09:24:34.
User:0 acquired lock at 06-10-2020 09:24:35.
User:3 acquired lock at 06-10-2020 09:24:35.正如您所看到的,每个线程都能够获得锁,这是不应该发生的。
一旦获得锁,其他线程就不能获得锁。
发布于 2020-10-06 05:00:00
根据RedLock.net/README.md,“在using块的末尾自动释放锁”。
因此,我认为在演示输出中发生的事情是:
using块中通过,释放它的锁(现在另一个线程可以获胜)如果希望看到锁获取失败,请在退出using块之前执行非常慢的操作(>10秒)。为了演示的目的,您可以在编写“获取”行之后使用Thread.Sleep(15000)。
https://stackoverflow.com/questions/64219151
复制相似问题