Java 有办法实现,变量级别这种细颗粒度的锁吗?有第三方库就更好了

2023-11-07 00:36:20 +08:00
 as9567585

简单来说,就是根据不同的参数来锁

大概的意思,如下代码

写的有点问题, 两个地方 do something 做的逻辑是一样的,只是参数不一样

2446 次点击
所在节点    Java
15 条回复
as9567585
2023-11-07 00:43:38 +08:00
写的有点问题, 两个地方 do something 做的逻辑是一样的,只是参数 arg 不一样
Akitora
2023-11-07 00:46:19 +08:00
如果是想实现 lock by key 类似的功能,可以试试 redis 的 setNX ,或者用 String.intern()作为 synchronize 的对象
as9567585
2023-11-07 00:48:38 +08:00
@Akitora 有直接在内存里实现的吗?有成熟的库就更好了 😁
Akitora
2023-11-07 00:51:06 +08:00
as9567585
2023-11-07 00:53:27 +08:00
看到一个这样的实现,https://blog.51cto.com/u_16213405/7704078

额,但是他没有在内存中移除锁,需要一个移除机制,最大存活时间什么的

但是,怕不好控制内存,这里的 arg 业务里是 userId ,理论上最多会创建 最大用户数量个 new Object()

有没有更好的实现呢?
youngPacce
2023-11-07 00:58:05 +08:00
ConcurrentHashMap? 不过可能需要自己重写下 hashcode 之类的。
silentsky
2023-11-07 01:18:40 +08:00
Guava Striped
stinkytofu
2023-11-07 01:35:50 +08:00
定义一个全局变量 map, 直接把 Lock 对象放到 map 里面就好了啊, 根据 key 取锁
as9567585
2023-11-07 01:48:28 +08:00
@silentsky 棒!
humpy
2023-11-07 02:04:34 +08:00
ConcurrentHashMap +1 ,用 ConcurrentHashMap 的 compute() 方法就行,key 传你的锁 ID ,remappingFunction 传你的业务逻辑,CHM 在执行 remappingFunction 的时候会获取 synchronized 锁,唯一需要注意的就是 key 的 hashcode() 选择
MYlyc
2023-11-07 08:45:30 +08:00
看不到图片,但看文字描述。是不是需要 redisson ?
wzcloud
2023-11-07 09:35:48 +08:00
guava 框架里面有,不过好像快十年了还是 beta 版本
xianzhe
2023-11-07 11:02:23 +08:00
JeffreyCai
2023-11-07 11:14:26 +08:00
yangxixi
353 天前
单体的话,可以考虑在 ConcurrentHashMap 存锁的实例,然后 synchronized 给实例加锁,分布式的话,上 redisson

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

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

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

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

© 2021 V2EX