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

问大佬们一个问题, Java 多线程中的 wait 和 notify 机制,如果部署多个节点怎么来实现类试的机制?好像只接触过分布式锁,有没有什么分布式等待唤醒之类的?或者相关的替代方案?

  •  
  •   lhqing · 2020-04-19 17:32:48 +08:00 · 3384 次点击
    这是一个创建于 1439 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问大佬们一个问题,java 多线程中的 wait 和 notify 机制,如果部署多个节点怎么来实现类试的机制?好像只接触过分布式锁,有没有什么分布式等待唤醒之类的?或者相关的替代方案?

    14 条回复    2020-04-20 11:51:15 +08:00
    BBCCBB
        1
    BBCCBB  
       2020-04-19 17:41:16 +08:00   ❤️ 1
    redisson 有实现基于 redis 的 CountDownLatch.
    Jooooooooo
        2
    Jooooooooo  
       2020-04-19 17:42:14 +08:00
    分布式的还是两种, 轮询和通知

    你要描述具体的需求
    BBCCBB
        3
    BBCCBB  
       2020-04-19 17:44:29 +08:00
    也可以用 mq. 完成了发个 mq.
    luckyrayyy
        4
    luckyrayyy  
       2020-04-19 17:56:56 +08:00
    这不是典型的生产消费模型
    lhqing
        5
    lhqing  
    OP
       2020-04-19 18:07:56 +08:00
    @Jooooooooo 没有具体需求哈哈,突然想到的
    sioncheng
        6
    sioncheng  
       2020-04-19 20:55:12 +08:00   ❤️ 1
    比如,zookeeper 的 watch 机制,https://www.cnblogs.com/shamo89/p/9787176.html
    FreeEx
        7
    FreeEx  
       2020-04-19 21:49:24 +08:00
    用不到的,所以没有。
    SpencerCJH
        8
    SpencerCJH  
       2020-04-20 00:44:49 +08:00
    为了不使用 wait notify 等底层 API,所有才有了 java.util.concurrent…………
    CoderGeek
        9
    CoderGeek  
       2020-04-20 02:26:45 +08:00
    没有等待唤醒这个概念 就是一直扫变化 push 或者 pull

    mq 、redis 、zk 临时节点 加锁扫库都可以
    MOETAN0
        10
    MOETAN0  
       2020-04-20 09:30:41 +08:00
    借助外部 zookeeper,节点端使用 apache-curator,参考其 locking 的代码示例。
    Aresxue
        11
    Aresxue  
       2020-04-20 09:35:42 +08:00
    想要仿照 java 原生 api 你就得把对象映射成共享内存,这样就可以进程通信了,但这个仅限于同一台物理机。要想和机器也没关系,那就只能用中间件了,redis 、zk 好做一些,mq 的话在不考虑事务的情况下也可以使用
    leonardyang
        12
    leonardyang  
       2020-04-20 11:31:06 +08:00
    即使部署集群,每个节点上的业务也应该是完整封装起来自己运行自己的,一个节点要控制另一个节点上线程的 wait 和 notify,节点间耦合度这么高不怕出问题吗
    iyangyuan
        13
    iyangyuan  
       2020-04-20 11:41:26 +08:00
    小项目 redis,大项目 mq
    sujin190
        14
    sujin190  
       2020-04-20 11:51:15 +08:00   ❤️ 1
    复杂服务中一般不会这样用,更多会使用消息驱动异步任务执行,也就是数据和状态永远时往前的,和时间一致,反向传播状态和数据和时间逆向,状态管理会变得更加复杂且不稳定,难以提高横向扩展和并发性能,维护也难很多

    简单系统当然无所谓了,简单的可以数据库轮询,zookeeper 的 watch,部分消息队列像 rabbitmq 也带有回执状态的也很容易实现

    https://github.com/snower/slock.git

    之前也用 golang 实现了一个性能不错的原子操作同步服务,可以实现一般系统中常用的 Lock 、Event 、Semaphore 语义,Java 多线程中的 wait 和 notify 机制其实就是 Event,而系统中实现的锁其实底层也是原子操作分装而来的,只不过加入了进程调度操作自动进入休眠和唤醒
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5817 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:20 · PVG 14:20 · LAX 23:20 · JFK 02:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.