封装 分布式工具,使用炒鸡方便
背景 有时候我们希望 :
- 获取锁执行 其他业务等待 获取锁在执行
- 获取到锁执行,获取不到就不执行
故而简单封装,用起来还是很挺爽的。
@Component
public class DistributedLockService {
private static final String DISTRIBUTED_LOCK_SERVICE = "distributed_lock_service:";
@Autowired
private RedissonClient redissonClient;
/**
* 等待执行 函数
* @param lockKey
* @param obj 函数参数
* @param function
* @return
*/
public Object lockFunction(String lockKey,Object obj,Function function){
RLock lock = redissonClient.getLock(DISTRIBUTED_LOCK_SERVICE+lockKey);
try {
lock.lock();
Object result = function.apply(obj);
return result;
}finally {
lock.unlock();
}
}
/**
* 尝试执行 函数
* @param lockKey
* @param obj 函数参数
* @param function
* @return
*/
public Object tryLockFunction(String lockKey, Object obj, Function function) {
RLock lock = redissonClient.getLock(DISTRIBUTED_LOCK_SERVICE + lockKey);
boolean tryLock = lock.tryLock();
if (tryLock) {
try {
Object result = function.apply(obj);
return result;
} finally {
lock.unlock();
}
}
return null;
}
/**
* 等待执行 函数
* @param lockKey
* @param supplier
* @return
*/
public Object lockSupplier(String lockKey, Supplier supplier){
RLock lock = redissonClient.getLock(DISTRIBUTED_LOCK_SERVICE+lockKey);
try {
lock.lock();
Object result = supplier.get();
return result;
}finally {
lock.unlock();
}
}
/**
* 尝试执行 函数
* @param lockKey
* @param supplier
* @return
*/
public Object tryLockSupplier(String lockKey, Supplier supplier) {
RLock lock = redissonClient.getLock(DISTRIBUTED_LOCK_SERVICE + lockKey);
boolean tryLock = lock.tryLock();
if (tryLock) {
try {
Object result = supplier.get();
return result;
} finally {
lock.unlock();
}
}
return null;
}
}
使用 注入 直接用,就是这么 朴实无华
@Test
public void testMultiThread() throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(10);
ExecutorService executorService = Executors.newFixedThreadPool(10);
CyclicBarrier cyclicBarrier = new CyclicBarrier(10);
for (int i = 0; i < 10; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(new Random().nextInt(60)*1000);
cyclicBarrier.await();
// 业务方法
distributedLockService.lockSupplier("test",()->{
System.out.println("尝试执行多次");
return null;
});
log.info("开始执行 {},{}",Thread.currentThread().getName());
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
});
}
countDownLatch.await();
executorService.shutdown();
}
@Test
public void testMultiThread() throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(10);
ExecutorService executorService = Executors.newFixedThreadPool(10);
CyclicBarrier cyclicBarrier = new CyclicBarrier(10);
for (int i = 0; i < 10; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(new Random().nextInt(60)*1000);
cyclicBarrier.await();
// 业务方法
distributedLockService.tryLockFunction("test","小米",(e)->{
System.out.println("尝试执行一次"+e);
return null;
});
log.info("开始执行 {},{}",Thread.currentThread().getName());
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
});
}
elk