1 ReentrantLock
它是一个可重入锁,即一个线程可重复加锁,即当前线程获取该锁再次获取不会被阻塞。获得几次锁,解锁也要解几次。
它有两种实现,公平锁和非公平锁。
- 公平锁:锁的获取顺序就应该符合请求上的绝对时间顺序
- 非公平锁:不按请求的时间,谁抢到就是谁的
默认实现的为非公平锁,因为公平锁为了保证时间上的绝对顺序,需要频繁的上下文切换,而非公平锁会降低一定的上下文切换,降低性能开销。
1 | //创建一个公平锁 |
2. 通过MySQL的GET_LOCK函数实现
获得锁
1 | GET_LOCK(str,timeout) |
根据字符串str 得到一个锁,超时为timeout 秒。若成功得到锁,则返回 1,若操作超时则返回0 ,当它获得锁之后,后面相同str的再获取这把锁就会一直等待,当超过timeout,就会返回0
释放锁
1 | RELEASE_LOCK(str); |
释放str这把锁,当连接中断后,这把锁也会释放的
使用
1 | 获取锁 |
3 通过MySQL行级锁进行实现
原理很简单,我们插入数据的时候都是只能插入一个唯一主键,如果有一个线程插入了,那么其他线程都不能插入了。
插入实体
1 | package com.pibigstar.domain; |
dao层:使用jpa
1 | package com.pibigstar.dao; |
具体实现
1 | package com.pibigstar.utils; |