美文网首页
封装 分布式工具,使用炒鸡方便

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

作者: 川流不息attitude | 来源:发表于2022-07-02 11:19 被阅读0次

背景 有时候我们希望 :

  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();
                    }
                }
            });
        }

相关文章

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

    背景 有时候我们希望 :获取锁执行 其他业务等待 获取锁在执行获取到锁执行,获取不到就不执行 故而简单封装,用起来...

  • Android-UIL-utils

    通用工具包封装或者是提取了供项目方便使用的工具类(工具类都是final class,private constru...

  • 繁忙的周一周二

    满课暴击! 看见小喵喵我就(^・ェ・^)心情就变得炒鸡炒鸡炒鸡炒鸡炒鸡炒鸡炒鸡炒鸡炒鸡炒鸡炒鸡炒鸡炒鸡炒鸡炒鸡炒鸡...

  • U盘系统,炒鸡方便!!!

    咳咳,我这几天寻思着,是不是要写一篇,对大多数人都有兴趣文章 而且我最近也做了一个U盘系统,所以我就将U盘系统的教...

  • 并发测试工具类 封装,方便使用

    并发测试工具类 封装,方便使用 很多时候我们都想做一些并发测试,又不想用 JMeter ,ab等工具所以直接用代码...

  • MG--Swift3.0 好用的分类

    老司机,又到周末啦,平时我们工作中会写很多的工具类,但是有一些使用工具类去使用又不是很方便,我们就把它抽取封装成分...

  • TabView,快速实现Android底部导航栏

    前言 主流的安卓APP,首页经常会采用底部导航栏切换的效果。针对这种情况,封装成TabView工具类,方便大家使用...

  • vue实时监听网络状态是wifi还是4G

    方法封装在工具类里面,方便在各个页面和项目中使用:utils.js: index.html: 网上的方法很难实现当...

  • 自定义pymysql工具类

    一、目标:建立一个pymysql工具类,方便后续使用的时候直接导入 对pymysql进行封装,提供一个接口,直接完...

  • OkGo请求封装

    封装的请求工具类 使用方式

网友评论

      本文标题:封装 分布式工具,使用炒鸡方便

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