lockAsync()顾名思义是异步加锁,相比较lock()的区别是不阻塞主流程;lock()必须加锁成功后才能顺序执行下面的代码;而lockAsync不用等待加锁是否成功,继续执行下面的代码,提高qps;
下面是lockAsync的具体用法,不同版本使用方法有区别。
redisson版本3.5.7的使用
一、加监听
RLock lock = redissonClient.getLock("testLockAsync1");
RFuture<Void> rfuture = lock.lockAsync(5, TimeUnit.SECONDS);
rfuture.addListener(new FutureListener<Void>() {
@Override
public void operationComplete(Future<Void> future) throws Exception {// 监听,加锁完成后执行
logger.error("testLockAsync1加锁成功!{},{}", future.isSuccess(), Thread.currentThread().getId());
}
});
二、用completionStage接口里的方法,这里我用了两种
1、whenComplete
RLock lock1 = redissonClient.getLock("testLockAsync1");
RFuture<Void> rfuture1 = lock1.lockAsync(5, TimeUnit.SECONDS);
rfuture1.whenComplete((res, e) -> {// 加锁完成后 异步执行
logger.error("testLockAsync2{},{}", rfuture1.isSuccess(), Thread.currentThread().getId());
});
2、whenCompleteAsync
RLock lock1 = redissonClient.getLock("testLockAsync1");
RFuture<Void> rfuture1 = lock1.lockAsync(5, TimeUnit.SECONDS);
rfuture1.whenCompleteAsync((res, e) -> {// 加锁完成后 异步执行
logger.error("testLockAsync2:whenCompleteAsync{},{}", rfuture1.isSuccess(), Thread.currentThread().getId());
});
本地测试看每一步执行的顺序、打印出线程id:
测试代码:
测试结果:
可以看出主流程无需等待是否加锁成功。当加锁成功后执行监听里的方法及whenComplete、whenCompleteAsync;
whenComplete、whenCompleteAsync这两个方法的区别暂时没搞懂,看log唯一的区别是线程的区别,执行whenComplete的线程是redisson-netty,whenCompleteAsync的线程是ForkJoinPool.commonPool-worker
redisson版本3.11.1的使用
在这个版本addListener监听方法去掉了。增加了一个新的方法onComplete。
RLock lock = redissonClient.getLock("testLockAsync1");
RFuture<Void> rfuture = lock.lockAsync(5, TimeUnit.SECONDS);
rfuture.onComplete((res, e) -> {
logger.error("testLockAsync1,加锁:{},线程:{}", rfuture.isSuccess(), Thread.currentThread().getId());
});
测试代码:
测试结果: