首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分布式锁无法使用RedLock.net。

分布式锁无法使用RedLock.net。
EN

Stack Overflow用户
提问于 2020-10-06 03:57:54
回答 1查看 3.7K关注 0票数 0

我想用Redis来实现分布式锁。我用RedLock.net nuget软件包来做这个。但是线程能够获得锁,即使另一个线程已经获得了锁。

下面是示例代码:

代码语言:javascript
复制
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.");
                    }
                }
            });
        }

这是我的演示的输出

代码语言:javascript
复制
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.

正如您所看到的,每个线程都能够获得锁,这是不应该发生的。

一旦获得锁,其他线程就不能获得锁。

EN

回答 1

Stack Overflow用户

发布于 2020-10-06 05:00:00

根据RedLock.net/README.md,“在using块的末尾自动释放锁”。

因此,我认为在演示输出中发生的事情是:

  1. 五个线程并行启动,每个线程都试图锁定同一资源。
  2. 线程4获胜(成功获取其锁)并执行以下操作;同时,其他线程等待(最多10秒):
    • 将“获取的锁”写入控制台
    • using块中通过,释放它的锁(现在另一个线程可以获胜)

  3. 线程2获胜,并在其余线程等待时执行相同的操作。
  4. 线程1、0和3也是如此。
  5. 每个线程都能快速完成它的工作,所以没有一个线程在10秒内获得锁。

如果希望看到锁获取失败,请在退出using块之前执行非常慢的操作(>10秒)。为了演示的目的,您可以在编写“获取”行之后使用Thread.Sleep(15000)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64219151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档