封装 分布式工具,使用炒鸡方便

背景 有时候我们希望 :

  1. 获取锁执行 其他业务等待 获取锁在执行
  2. 获取到锁执行,获取不到就不执行

故而简单封装,用起来还是很挺爽的。

@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();
                    }
                }
            });
        }
posted @ 2022-07-02 11:22  川流不息&  阅读(32)  评论(0编辑  收藏  举报