极客时间-《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同步转异步
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变量写先于读,保证加锁后操作可见
网友评论