as9567585
V2EX  ›  Java

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

  •  
  •   as9567585 · Nov 7, 2023 · 4612 views
    This topic created in 919 days ago, the information mentioned may be changed or developed.

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

    大概的意思,如下代码

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

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

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

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

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

    有没有更好的实现呢?
    youngPacce
        6
    youngPacce  
       Nov 7, 2023
    ConcurrentHashMap? 不过可能需要自己重写下 hashcode 之类的。
    silentsky
        7
    silentsky  
       Nov 7, 2023 via Android   ❤️ 2
    Guava Striped
    stinkytofu
        8
    stinkytofu  
       Nov 7, 2023
    定义一个全局变量 map, 直接把 Lock 对象放到 map 里面就好了啊, 根据 key 取锁
    as9567585
        9
    as9567585  
    OP
       Nov 7, 2023
    @silentsky 棒!
    humpy
        10
    humpy  
       Nov 7, 2023
    ConcurrentHashMap +1 ,用 ConcurrentHashMap 的 compute() 方法就行,key 传你的锁 ID ,remappingFunction 传你的业务逻辑,CHM 在执行 remappingFunction 的时候会获取 synchronized 锁,唯一需要注意的就是 key 的 hashcode() 选择
    MYlyc
        11
    MYlyc  
       Nov 7, 2023
    看不到图片,但看文字描述。是不是需要 redisson ?
    wzcloud
        12
    wzcloud  
       Nov 7, 2023 via iPhone
    guava 框架里面有,不过好像快十年了还是 beta 版本
    JeffreyCai
        14
    JeffreyCai  
       Nov 7, 2023   ❤️ 1
    yangxixi
        15
    yangxixi  
       Jan 9, 2024
    单体的话,可以考虑在 ConcurrentHashMap 存锁的实例,然后 synchronized 给实例加锁,分布式的话,上 redisson
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5463 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 05:52 · PVG 13:52 · LAX 22:52 · JFK 01:52
    ♥ Do have faith in what you're doing.