参考 SpringBoot实现Redis分布式锁 https://www.jianshu.com/p/750ac97eb29e 实现原理 加锁解锁 执行逻辑之前,加锁 执行逻辑之后,删除锁 加锁和删除锁必须是同一个对象的行为。 获取锁删除锁 使用setnx,保证只有一个对象可以设置锁成功,只有一个对 ...
分类:
编程语言 时间:
2020-04-05 17:05:13
阅读次数:
72
lock 与 lockInterruptibly比较区别在于:lock 优先考虑获取锁,待获取锁成功后,才响应中断。lockInterruptibly 优先考虑响应中断,而不是响应锁的普通获取或重入获取。详细区别: ReentrantLock.lockInterruptibly允许在等待时由其它线程 ...
分类:
其他好文 时间:
2020-03-31 18:51:29
阅读次数:
63
锁优化 自适应的自旋锁 自旋锁,为了让线程等待,让线程执行一个忙循环(自旋)。超过10次仍然没有成功获取锁,线程挂起。 自适应的自旋锁,前一次在同一个锁上的自旋时间和锁的拥有者的状态决定。在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在进行中,那么虚拟机就会认为这次自旋也很有可能再次 ...
分类:
其他好文 时间:
2020-03-31 01:00:27
阅读次数:
93
在java代码进行redis集群锁获取锁的时候,报如下错误 org.redisson.client.RedisException: ERR Error running script ( 或者 Exception in thread "Thread-24" org.redisson.client.Re ...
分类:
其他好文 时间:
2020-03-29 17:57:29
阅读次数:
434
Synchronize实现原理 java对象头中存在一个指向monitor对象的指针。每个java对象在内存中都对应一个monitor对象。monitor对象就是用来存放对象的锁信息的。 monitor对象重要属性: count:用来存放当前对象被获取锁的次数,0表示对象没有被线程占有。 owner ...
分类:
其他好文 时间:
2020-03-28 10:35:34
阅读次数:
92
前言 前面分析了Redisson可重入锁的原理,主要是通过lua脚本加锁及设置过期时间来保证锁执行的原子性,然后每个线程获取锁会将获取锁的次数+1,释放锁会将当前锁次数-1,如果为0则表示释放锁成功。 可重入原理和JDK中的可重入锁都是一致的。 Redisson公平锁原理 JDK中也有公平锁和非公平 ...
分类:
其他好文 时间:
2020-03-20 12:31:11
阅读次数:
68
两者区别: 1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类; 2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁; 3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放 ...
分类:
其他好文 时间:
2020-03-18 15:39:48
阅读次数:
46
概述 在之前, 我也使用redis做过分布式锁, 当时的做法是这样的: 1. setnx: 向 redis中创建一个过期时间为1s的key, 若创建失败, 则锁获取失败 2. expire: 获取锁成功后, 给锁增加过期时间 3. del: 处理后释放锁 当时觉得貌似没什么问题. 是我太天真了, 今 ...
分类:
其他好文 时间:
2020-03-15 18:54:59
阅读次数:
60
自旋锁:spinlock 是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环好用CPU 代码: import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic. ...
分类:
编程语言 时间:
2020-03-07 20:50:33
阅读次数:
106
张图说明下要分享的内容: 01. Lock接口 JUC包中的 Lock 接口支持那些语义不同(重入、公平等)的锁规则。所谓语义不同,是指锁可是有"公平机制的锁"、"非公平机制的锁"、"可重入的锁"等等。 "公平机制"是指"不同线程获取锁的机制是公平的", 而"非公平机制"则是指"不同线程获取锁的机制 ...
分类:
其他好文 时间:
2020-02-19 00:34:04
阅读次数:
71