问大佬们一个问题,java 多线程中的 wait 和 notify 机制,如果部署多个节点怎么来实现类试的机制?好像只接触过分布式锁,有没有什么分布式等待唤醒之类的?或者相关的替代方案?
1
BBCCBB 2020-04-19 17:41:16 +08:00 1
redisson 有实现基于 redis 的 CountDownLatch.
|
2
Jooooooooo 2020-04-19 17:42:14 +08:00
分布式的还是两种, 轮询和通知
你要描述具体的需求 |
3
BBCCBB 2020-04-19 17:44:29 +08:00
也可以用 mq. 完成了发个 mq.
|
4
luckyrayyy 2020-04-19 17:56:56 +08:00
这不是典型的生产消费模型
|
5
lhqing OP @Jooooooooo 没有具体需求哈哈,突然想到的
|
6
sioncheng 2020-04-19 20:55:12 +08:00 1
比如,zookeeper 的 watch 机制,https://www.cnblogs.com/shamo89/p/9787176.html
|
7
FreeEx 2020-04-19 21:49:24 +08:00
用不到的,所以没有。
|
8
SpencerCJH 2020-04-20 00:44:49 +08:00
为了不使用 wait notify 等底层 API,所有才有了 java.util.concurrent…………
|
9
CoderGeek 2020-04-20 02:26:45 +08:00
没有等待唤醒这个概念 就是一直扫变化 push 或者 pull
mq 、redis 、zk 临时节点 加锁扫库都可以 |
10
MOETAN0 2020-04-20 09:30:41 +08:00
借助外部 zookeeper,节点端使用 apache-curator,参考其 locking 的代码示例。
|
11
Aresxue 2020-04-20 09:35:42 +08:00
想要仿照 java 原生 api 你就得把对象映射成共享内存,这样就可以进程通信了,但这个仅限于同一台物理机。要想和机器也没关系,那就只能用中间件了,redis 、zk 好做一些,mq 的话在不考虑事务的情况下也可以使用
|
12
leonardyang 2020-04-20 11:31:06 +08:00
即使部署集群,每个节点上的业务也应该是完整封装起来自己运行自己的,一个节点要控制另一个节点上线程的 wait 和 notify,节点间耦合度这么高不怕出问题吗
|
13
iyangyuan 2020-04-20 11:41:26 +08:00
小项目 redis,大项目 mq
|
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,而系统中实现的锁其实底层也是原子操作分装而来的,只不过加入了进程调度操作自动进入休眠和唤醒 |