Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
weixin_57962205
redisson
提交
68ad0add
R
redisson
项目概览
weixin_57962205
/
redisson
与 Fork 源项目一致
从无法访问的项目Fork
通知
10
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
redisson
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
68ad0add
编写于
11月 04, 2020
作者:
N
Nikita Koksharov
提交者:
GitHub
11月 04, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Revert "Avoid redisson fair lock blocking if there are lots of registered thr…"
上级
df0c74a2
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
0 addition
and
73 deletion
+0
-73
redisson/src/main/java/org/redisson/RedissonFairLock.java
redisson/src/main/java/org/redisson/RedissonFairLock.java
+0
-16
redisson/src/test/java/org/redisson/RedissonFairLockTest.java
...sson/src/test/java/org/redisson/RedissonFairLockTest.java
+0
-57
未找到文件。
redisson/src/main/java/org/redisson/RedissonFairLock.java
浏览文件 @
68ad0add
...
...
@@ -201,22 +201,6 @@ public class RedissonFairLock extends RedissonLock implements RLock {
"return nil;"
+
"end;"
+
// check if the lock is not held, and other queues are not used
"while true do "
+
"local firstThreadId = redis.call('lindex', KEYS[2], 0);"
+
"if (firstThreadId == false) or (firstThreadId == ARGV[2]) then "
+
"break;"
+
"end;"
+
"local timeout = tonumber(redis.call('zscore', KEYS[3], firstThreadId));"
+
"if (timeout > tonumber(ARGV[4])) and (redis.call('exists', KEYS[1]) == 0) then "
+
"redis.call('lpop', KEYS[2]);"
+
"redis.call('zrem', KEYS[3], firstThreadId);"
+
"else "
+
"break;"
+
"end;"
+
"end;"
+
// the lock cannot be acquired
// check if the thread is already in the queue
"local timeout = redis.call('zscore', KEYS[3], ARGV[2]);"
+
...
...
redisson/src/test/java/org/redisson/RedissonFairLockTest.java
浏览文件 @
68ad0add
...
...
@@ -933,62 +933,5 @@ public class RedissonFairLockTest extends BaseConcurrentTest {
await
().
atMost
(
30
,
TimeUnit
.
SECONDS
).
until
(()
->
lockedCounter
.
get
()
==
totalThreads
);
}
@Test
public
void
testLockBlock
()
throws
InterruptedException
{
Config
cfg
=
createConfig
();
cfg
.
setLockWatchdogTimeout
(
30000
);
RedissonClient
redisson
=
Redisson
.
create
(
cfg
);
int
totalExecutorCount
=
5
;
int
totalThreadCount
=
100
;
int
interval
=
1000
;
Lock
lock
=
redisson
.
getFairLock
(
"testLockBlock"
);
for
(
int
count
=
0
;
count
<
totalExecutorCount
;
count
++)
{
ExecutorService
executor
=
Executors
.
newFixedThreadPool
(
totalThreadCount
);
for
(
int
i
=
0
;
i
<
totalThreadCount
;
i
++)
{
final
int
finalI
=
i
;
executor
.
submit
(()
->
{
log
.
info
(
"running "
+
finalI
+
" in thread "
+
Thread
.
currentThread
().
getId
());
try
{
lock
.
lock
();
log
.
info
(
"Thread "
+
finalI
+
" got lock"
);
}
catch
(
Exception
ex
)
{
log
.
error
(
"Failed to get lock"
);
}
finally
{
lock
.
unlock
();
}
});
}
executor
.
shutdownNow
();
}
redisson
.
shutdown
();
// In case connection closed
redisson
=
Redisson
.
create
(
cfg
);
long
timeOut
=
redisson
.
getConfig
().
getLockWatchdogTimeout
()
+
interval
;
ExecutorService
lockExecutor
=
Executors
.
newFixedThreadPool
(
1
);
Lock
lockSecond
=
redisson
.
getFairLock
(
"testLockBlock"
);
Future
<
Boolean
>
future
=
lockExecutor
.
submit
(
new
Callable
<
Boolean
>()
{
@Override
public
Boolean
call
()
throws
Exception
{
// check if this lock can be acquired in short time
Thread
.
sleep
(
timeOut
);
lockSecond
.
lock
();
return
Boolean
.
TRUE
;
}
});
Boolean
got
=
Boolean
.
FALSE
;
try
{
got
=
future
.
get
(
timeOut
+
interval
,
TimeUnit
.
MILLISECONDS
);
if
(
got
)
{
log
.
info
(
"Got lock immediately after startup"
);
}
else
{
log
.
info
(
"Failed to get lock due to blocked"
);
}
}
catch
(
Exception
e
){
log
.
info
(
"Failed to get lock due to blocked"
);
}
Assert
.
assertTrue
(
got
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录