Java 有类似于 Redis 锁的,只在本应用的锁吗?

2022-06-07 18:20:09 +08:00
 haython

想要的效果:lock(name, 30s) name 是变量,后边是自动失效时间 不知道有没有类似的成熟库

4161 次点击
所在节点    Java
28 条回复
potatowish
2022-06-08 12:20:33 +08:00
@ZeawinL 时间参数是最大等待锁的时间,不是最大持有时间啊
RedBeanIce
2022-06-08 12:29:51 +08:00
2l 是对的。
haython
2022-06-08 12:56:51 +08:00
@ZeawinL 锁什么时候释放,Map 什么时候清除这个 key
姑且按
lockMap.remove("key-name");
lock.unlock();
这种来处理
当第一个线程 remove 操作之前,有第二个线程来获取锁,获取的还是老的 ReentrantLock ,在 tryLock 阶段,第一个线程 remove 操作了,第三个线程来获取锁,肯定是新的 ReentrantLock
ZeawinL
2022-06-08 13:36:57 +08:00
@potatowish 理解错了,感谢指正
mrsatangel
2022-06-08 18:16:38 +08:00
potatowish
2022-06-08 22:27:59 +08:00
用字符串变量作为锁的名称没有太难吧,用 ConcurrentHashMap 映射一下,或者直接用 intern ,获取常量池引用。

我觉得重点应该是如何实现锁的过期机制,有没有必要可先放一边。
NULL2020
2022-07-21 11:01:18 +08:00
所以,OP 最后使用了什么方法?
haython
2022-07-21 15:33:54 +08:00
@NULL2020
synchronized (name.tostring().intern()) {
..
}

一是因为我的业务可以确定不会有太多字符串,二是可能还没等到常量池太大,就又重新部署一次了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/857973

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX