简单来说,就是根据不同的参数来锁
大概的意思,如下代码
写的有点问题, 两个地方 do something 做的逻辑是一样的,只是参数不一样
1
as9567585 OP 写的有点问题, 两个地方 do something 做的逻辑是一样的,只是参数 arg 不一样
|
2
Akitora 2023-11-07 00:46:19 +08:00 via Android
如果是想实现 lock by key 类似的功能,可以试试 redis 的 setNX ,或者用 String.intern()作为 synchronize 的对象
|
4
Akitora 2023-11-07 00:51:06 +08:00 via Android
|
5
as9567585 OP 看到一个这样的实现,https://blog.51cto.com/u_16213405/7704078
额,但是他没有在内存中移除锁,需要一个移除机制,最大存活时间什么的 但是,怕不好控制内存,这里的 arg 业务里是 userId ,理论上最多会创建 最大用户数量个 new Object() 有没有更好的实现呢? |
6
youngPacce 2023-11-07 00:58:05 +08:00
ConcurrentHashMap? 不过可能需要自己重写下 hashcode 之类的。
|
7
silentsky 2023-11-07 01:18:40 +08:00 via Android 2
Guava Striped
|
8
stinkytofu 2023-11-07 01:35:50 +08:00
定义一个全局变量 map, 直接把 Lock 对象放到 map 里面就好了啊, 根据 key 取锁
|
10
humpy 2023-11-07 02:04:34 +08:00
ConcurrentHashMap +1 ,用 ConcurrentHashMap 的 compute() 方法就行,key 传你的锁 ID ,remappingFunction 传你的业务逻辑,CHM 在执行 remappingFunction 的时候会获取 synchronized 锁,唯一需要注意的就是 key 的 hashcode() 选择
|
11
MYlyc 2023-11-07 08:45:30 +08:00
看不到图片,但看文字描述。是不是需要 redisson ?
|
12
wzcloud 2023-11-07 09:35:48 +08:00 via iPhone
guava 框架里面有,不过好像快十年了还是 beta 版本
|
13
xianzhe 2023-11-07 11:02:23 +08:00 1
|
14
JeffreyCai 2023-11-07 11:14:26 +08:00 1
|
15
yangxixi 304 天前
单体的话,可以考虑在 ConcurrentHashMap 存锁的实例,然后 synchronized 给实例加锁,分布式的话,上 redisson
|