前面提到了在RPC调用中的同步转异步的过程,见Dubbo的DefaultFeture。
我们把这种模式成为Guarded Suspension(守护挂起),又称多线程的if,有一下几个特点
- 创建一个GuardedObject包含ID和Response对象,并且在get是否判断Response对象是否为空,如果为空该线程wait住
- 在其他的线程对GuardedObject的Response赋值,并且notify。
- 主要get和setResponse的要加锁。
具体实现见下面
- 通过GuardObject.create创建一个实例
- 通过get()方法获取并且阻塞住
- 返回时候其他线程通过通过GuardObject.objArraived赋值
1 | private static Map<String, GuardObject> container = new ConcurrentHashMap<>(); |