针对单一key加读写锁
2023-03-31 10:39:17 时间
一、什么是读写锁
读写锁是JDK1.5提供的一个工具锁,适用于读多写少的场景,将读写分离,从而提高并发性。
二、读写锁的特点
读锁是共享锁,写锁是排他锁,读锁和写锁不能同时存在;
读锁不能升级为写锁;
写锁可以降级为读锁;
三、锁的本质
锁的本质就是锁住一块资源而不是一块代码. 在常见的一些代码实现都是加一把大锁,将这一块代码资源统一加锁,无法针对资源进行精确进行锁控制.
四、代码实现
`
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@Slf4j
public class UserDefinedLock {
final ConcurrentHashMap<String, ReadWriteLock> map = new ConcurrentHashMap<>();
public UserDefinedLock() {
}
/**
* 从map里获取锁 如果存在则返回 不存在则创建
*
* @param key key
* @return lock
*/
public void createOrGetLock(String key) {
synchronized (key.intern()) {
map.compute(key, (k, lock) -> {
if (lock == null) {
lock = new ReentrantReadWriteLock();
}
return lock;
});
}
}
/**
* 获取锁 会阻塞
*
* @param key key
*/
public void writeLock(String key) {
map.get(key).writeLock().lock();
}
public void readLock(String key) {
map.get(key).readLock().lock();
}
/**
* 释放锁 必须由申请锁的线程进行调用
*
* @param key key
*/
public void unWriteLock(String key) {
ReadWriteLock lock = map.get(key);
if (null != lock) {
try {
lock.writeLock().unlock();
} catch (Exception e) {
log.error("释放写锁失败,key:{}, msg:{}", key, e.getMessage());
}
}
}
public void unReadLock(String key) {
ReadWriteLock lock = map.get(key);
if (null != lock) {
try {
lock.readLock().unlock();
} catch (Exception e) {
log.error("释放读锁失败,key:{}, msg:{}", key, e.getMessage());
}
}
}
public static void main(String[] args) {
UserDefinedLock userDefinedLock = new UserDefinedLock();
ArrayList list = new ArrayList<String>();
for (int i = 0; i < 5; i++) {
String key = String.valueOf("测试" + i);
new Thread(() -> {
try {
userDefinedLock.createOrGetLock(key);
userDefinedLock.readLock(key);
System.out.println("-----" + key + "----");
list.add(key);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
userDefinedLock.unReadLock(key);
}
}, "read-" + key).start();
}
}
}
`
相关文章
- 北大&FAIR&自动化所&快手提出基于动量对比学习的层次Transformer—HiT,用于视频文本检索!代码已开源!
- 编码风格不一,代码杂乱无章?五招解决你的痛点
- NUS 联合 Sea AI Lab 发表 Multi-view Pose Transformer,完全端到端学习,超强可扩展性
- 通过强化注意多关系图神经网络实现的预训练推荐系统
- 清华特奖:有人用AI识别甲骨文,有人研究6G,还有奥运冠军杨倩
- [网络安全] 二.Web渗透信息收集之域名、端口、服务、指纹、旁站、CDN和敏感信息
- Gartner发布重要战略科技趋势,中国企业该关注哪些?
- 将密集的检索解释为主题的混合物
- 科学家开发独特的机器人手 可以在不松开手的情况下旋转物体
- [网络安全] 五.XSS跨站脚本攻击详解及分类-1
- 登顶Nature | DeepMind用AI首次实现数学领域重大进展,助力科学家证实两大猜想
- [网络安全] 六.XSS跨站脚本攻击靶场案例九题及防御方法-2
- 华为欧拉操作系统,百万行代码全部贡献开源社区
- [网络安全] 九.Wireshark安装入门及抓取网站用户名密码-1
- 深度强化学习探索算法最新综述,近200篇文献揭示挑战和未来方向
- Nginx+keepalived 实现高可用,防盗链及动静分离配置,写得太好了!
- 实锤!华为又一业务出售
- [网络安全] 十五.文件上传漏洞 (4)Upload-labs靶场及CTF题目01-10
- [网络安全] 二十一.Chrome密码保存渗透解析、Chrome蓝屏漏洞及音乐软件漏洞复现
- Swin Transformer V2!MSRA原班人马提出了30亿参数版本的Swin Transformer!