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

2020-04-19 17:32:48 +08:00
 lhqing

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

3644 次点击
所在节点    Java
14 条回复
BBCCBB
2020-04-19 17:41:16 +08:00
redisson 有实现基于 redis 的 CountDownLatch.
Jooooooooo
2020-04-19 17:42:14 +08:00
分布式的还是两种, 轮询和通知

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

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

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

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

之前也用 golang 实现了一个性能不错的原子操作同步服务,可以实现一般系统中常用的 Lock 、Event 、Semaphore 语义,Java 多线程中的 wait 和 notify 机制其实就是 Event,而系统中实现的锁其实底层也是原子操作分装而来的,只不过加入了进程调度操作自动进入休眠和唤醒

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/664011

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX