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

232 天前
 as9567585

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

大概的意思,如下代码

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

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

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

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

有没有更好的实现呢?
youngPacce
232 天前
ConcurrentHashMap? 不过可能需要自己重写下 hashcode 之类的。
silentsky
232 天前
Guava Striped
stinkytofu
232 天前
定义一个全局变量 map, 直接把 Lock 对象放到 map 里面就好了啊, 根据 key 取锁
as9567585
232 天前
@silentsky 棒!
humpy
232 天前
ConcurrentHashMap +1 ,用 ConcurrentHashMap 的 compute() 方法就行,key 传你的锁 ID ,remappingFunction 传你的业务逻辑,CHM 在执行 remappingFunction 的时候会获取 synchronized 锁,唯一需要注意的就是 key 的 hashcode() 选择
MYlyc
232 天前
看不到图片,但看文字描述。是不是需要 redisson ?
wzcloud
232 天前
guava 框架里面有,不过好像快十年了还是 beta 版本
xianzhe
232 天前
JeffreyCai
232 天前
yangxixi
169 天前
单体的话,可以考虑在 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