实现异步转同步

极客时间-《Java并发编程实战》学习笔记

异步方法:调用方法,在方法中启动子线程
异步调用:启动子线程调用方法
异步转同步:由于同步简单易用,将异步方法进行封装,同步调用,等待结果

Lock和Condition

Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
// method 加锁
lock.lock();
try {
 while(条件不满足) {
   condition.await(timeout);
  }
  // do something
  ......
} finally{
 lock.unlock();
}

//method 释放锁
lock.lock()
try {
  // do something
 ......
 condition.signalAll();
} finally{
 lock.unlock();
}

实现阻塞队列

1个Lock、2个Condition(NotEmpty和NotFull)。入队结束后NotEmpty发出信号,出队结束后NotEmpty发出信号。

Dubbo同步转异步

DefaultFuture.java

get(int timeout)方法和doReceived(Response res)方法,可以看到使用Lock和Condition

Lock

Lock中有一个volatile标示到state,在获取锁和释放锁都会对volatile变量读写
根据happen-before特性
线程1-doSomething>线程1-unlock
线程1-unlock时会写state>线程2-lock时会读state(volatile变量写先于读)
线程1-doSomething>线程2-lock(根据前2个和happen-before传递性)
通过传递性和volatile变量写先于读,保证加锁后操作可见

你可能感兴趣的:(实现异步转同步)