公司内部分享系列-分布式锁相关

2023-11-18 10:24:14 浏览数 (2)

前言碎语

以下内容为博主准备在公司内部分享【分布式锁】相关列的提纲,全文基本都是关键字,分享过程全靠编了,尽量涵盖多线程以及锁分布式锁的各种使用技巧 和使用场景吧。

和锁相关的东西?

多线程、高并发、大流量、资源保护、并行、串行

锁的使用场景?

了解了以上的和锁相关的东西后,我们大概知道了锁的使用场景,如:

 多线程高并发下的资源保护,有序的消费资源

锁的分类?

基于锁的使用场景的细分,有会很多不同锁

  1. 自旋锁
  2. 阻塞锁
  3. 读写锁
  4. 可重入锁
  5. 公平锁(非公平锁)……

并发包下的这些算高级锁?(阻挡别人访问的都有锁的影子)

  1. 如AtomicInteger,AtomicBoolean等Atomicxxxx原子变量
  2. 如ConcurrentHashMap,ConcurrentLinkedQueue等Concurrentxxxxx线程安全数据存储结构
  3. 如semaphore,CountDownLatch,CyclicBarrier等多线程控制类

分布式锁?

如上的所述的在单实例的时候没点问题,基于cpu的cas(compare And Swap)控制,这些锁可以很好的解决多线程高并发下的资源抢占问题。那么,跨jvm进程的多实例呢?

redis原子操作实现分布式锁。

分布式锁需要考虑的?

锁时效,锁等待,锁释放通知,锁粒度可控,JDK有的都要有,what?redis客户端redisson都已经实现的差不多了。

Redisson的部分实现细节?

代码语言:javascript复制
public void lockInterruptibly(long leaseTime, TimeUnit unit) throws InterruptedException {
        Long ttl = tryAcquire(leaseTime, unit);//获取锁
        if (ttl == null) {//为空代表已拿到
      return;
        }
        long threadId = Thread.currentThread().getId();//获取线程ID
        RFuturefuture = subscribe(threadId);//订阅锁释放通知
        get(future);//阻塞等待锁释放通知
        try {
            while (true) {
                ttl = tryAcquire(leaseTime, unit);//尝试拿锁
                // lock acquired
                if (ttl == null) {
                    break;
                }
                // waiting for message
                if (ttl >= 0) {
                    getEntry(threadId).getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS);//使用信号量阻塞
                } else {
                    getEntry(threadId).getLatch().acquire();//释放信号
                }
            }
        } finally {
            unsubscribe(future, threadId);
        }
//        get(lockAsync(leaseTime, unit));
    }

怎么简化锁使用?

项目地址:https://gitee.com/kekingcn/spring-boot-klock-starter

项目的特点?

  1. Spring boot组件开箱即用
  2. 基于注解aop,简单实用
  3. 锁等待,锁释放可全局,可局部灵活控制
  4. 使用Spel获取锁Key值,锁粒度灵活细分化

后记总结 知其然知其所以然,然后了解同样的东西不同的实现方式不同的应用场景,下次遇到类似问题便可迎刃而解。不仅多线程和分布式锁是这样,其他技术概念都一样

0 人点赞