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

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

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

4480 次点击
所在节点    Java
28 条回复
golangLover
2022-06-07 18:50:22 +08:00
guava cache
sulinwork
2022-06-07 19:26:13 +08:00
都是本地了 为何不直接用 JDK 自带的 Lock 或者 synchronized
haython
2022-06-07 19:45:18 +08:00
@sulinwork 你肯定没看懂我说什么。。。
potatowish
2022-06-07 21:35:31 +08:00
可以尝试用 Semaphore 信号量和 DelayQueue 延迟队列自己封装一个
nl101531
2022-06-07 22:01:14 +08:00
本地锁一般没必要加超时时间,使用完就释放了,没使用完一直持久就好了,所以没怎么见到过你这种需求。

redis 之所以有超时,是分布式带来的不确定性。
mosliu
2022-06-07 22:37:16 +08:00
1L 说的应该是对的 记得是用过
b1t
2022-06-07 23:24:38 +08:00
本地缓存?
rowe
2022-06-08 00:43:53 +08:00
redis 加过期时间是因为 在分布式环境加锁风险太大 redis 给出兜底的方案, 单应用加锁随便玩好吗
chendy
2022-06-08 07:49:18 +08:00
Map<String, Lock>
超时感觉没必要,都写 finally 里了
redis 超时是怕客户端抽了不释放锁,单机环境没有这个问题
wanguorui123
2022-06-08 08:38:12 +08:00
自旋锁
mosliu
2022-06-08 09:04:34 +08:00
查了下 当时用的
caffeine 可以 expire
@haython
qocja
2022-06-08 09:33:38 +08:00
如果你想要锁值的 参考这个文章
qocja
2022-06-08 09:33:46 +08:00
huangz003
2022-06-08 09:41:17 +08:00
caffeine > guava cache
caffeine 是基于 guava cache 开发的,可以构建过期策略,如超时,设置容量大小等方式
nothingistrue
2022-06-08 10:26:08 +08:00
你是想用缓存,还是要线程加锁,还是要利用定时自动解锁做业务逻辑。如果是线程加锁的话,用 await 、wait 、notify 这些线程通信机制来解锁会更有效,实在不行,你还可以用 sleep 。如果是另外两个场景,用 Redis ,比自己搞,更简单还更可靠。
nekoneko
2022-06-08 10:29:47 +08:00
synchronized(name.intern())
单应用不需要过期时间
haython
2022-06-08 10:48:45 +08:00
@nekoneko 还是你这个让人想不到。。。
ZeawinL
2022-06-08 11:15:20 +08:00
#16 楼的方案挺好
ZeawinL
2022-06-08 11:19:36 +08:00
或许也可以使用 ConcurrentHashMap 结合 ReentrantLock 实现.

```
Map<String, ReentrantLock> lockMap = new ConcurrentHashMap<>();
ReentrantLock lock = lockMap.getOrDefault("key-name", new ReentrantLock());
lock.tryLock(1, TimeUnit.SECONDS);
```

会不会有什么问题? 坐等大佬指出
ZeawinL
2022-06-08 11:34:33 +08:00
纠正一下 #19

```
Map<String, ReentrantLock> lockMap = new ConcurrentHashMap<>();
ReentrantLock lock = lockMap.computeIfAbsent("key-name", l -> new ReentrantLock());
lock.tryLock(1, TimeUnit.SECONDS);
```

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

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

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

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

© 2021 V2EX