V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
as9567585
V2EX  ›  Java

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

  •  
  •   as9567585 · 2023-11-07 00:36:20 +08:00 · 2434 次点击
    这是一个创建于 401 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    大概的意思,如下代码

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

    https://i.imgur.com/404zTJ7.jpg

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

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

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

    有没有更好的实现呢?
    youngPacce
        6
    youngPacce  
       2023-11-07 00:58:05 +08:00
    ConcurrentHashMap? 不过可能需要自己重写下 hashcode 之类的。
    silentsky
        7
    silentsky  
       2023-11-07 01:18:40 +08:00 via Android   ❤️ 2
    Guava Striped
    stinkytofu
        8
    stinkytofu  
       2023-11-07 01:35:50 +08:00
    定义一个全局变量 map, 直接把 Lock 对象放到 map 里面就好了啊, 根据 key 取锁
    as9567585
        9
    as9567585  
    OP
       2023-11-07 01:48:28 +08:00
    @silentsky 棒!
    humpy
        10
    humpy  
       2023-11-07 02:04:34 +08:00
    ConcurrentHashMap +1 ,用 ConcurrentHashMap 的 compute() 方法就行,key 传你的锁 ID ,remappingFunction 传你的业务逻辑,CHM 在执行 remappingFunction 的时候会获取 synchronized 锁,唯一需要注意的就是 key 的 hashcode() 选择
    MYlyc
        11
    MYlyc  
       2023-11-07 08:45:30 +08:00
    看不到图片,但看文字描述。是不是需要 redisson ?
    wzcloud
        12
    wzcloud  
       2023-11-07 09:35:48 +08:00 via iPhone
    guava 框架里面有,不过好像快十年了还是 beta 版本
    JeffreyCai
        14
    JeffreyCai  
       2023-11-07 11:14:26 +08:00   ❤️ 1
    yangxixi
        15
    yangxixi  
       338 天前
    单体的话,可以考虑在 ConcurrentHashMap 存锁的实例,然后 synchronized 给实例加锁,分布式的话,上 redisson
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2267 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:53 · PVG 23:53 · LAX 07:53 · JFK 10:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.