美文网首页
实现异步转同步

实现异步转同步

作者: leo小超 | 来源:发表于2019-05-10 23:36 被阅读0次

    极客时间-《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变量写先于读,保证加锁后操作可见

    相关文章

      网友评论

          本文标题:实现异步转同步

          本文链接:https://www.haomeiwen.com/subject/znluoqtx.html