在我的《java并发编程》上一篇文章中为大家介绍了《ReentrantLock读写锁》,ReentrantReadWriteLock可以保证最多同时有一个线程在写数据,或者可以同时有多个线程读数据,但读写不能同时进行。
比如你正在做的是日志,有一个线程正在做写操作,但是在写日志的时候你可能需要把日志集中转移到集中管理日志服务,但是此时读线程不能读数据(因为无法获取读锁)。面对这个需求,ReentrantReadWriteLock显然不是我们的解决方案,我们希望:最多一个线程在进行写操作(加写锁),但是同时允许多个线程进行读操作(加读锁),解决方案是StampedLock。
StampedLock 同样可以实现写锁和读锁的功能,Stamped在英文中有印章的含义,对于StampedLock大家可以这么理解,使用一个印章加锁,必须使用该印章解锁。
public class TestStampedLock {
Map<String,String> map = new HashMap<>();
//锁对象
private StampedLock lock = new StampedLock();
//写操作函数
public void put(String key, String value){
long stamp = lock.writeLock(); //加写锁
try {
map.put(key, value); //写操作
} finally {
lock.unlockWrite(stamp); //释放写锁
}
}
public String get(String key) {
long stamp = lock.readLock(); //加读锁
try {
return map.get(key); //读操作
} finally {
lock.unlockRead(stamp); //释放读锁
}
}
}
上文中的读锁readLock,在StampedLock模式中被称为悲观读锁,之所以叫做悲观读锁是和StampedLock支持的另一种模式“乐观读”相对应的。写锁、悲观读锁的语义和 ReadWriteLock 的写锁、读锁的语义基本是一致的,允许多个线程同时获取悲观读锁,但是只允许一个线程获取写锁,写锁和悲观读锁是互斥的。多线程环境下,写操作的同时不能读。所以到这里为止,StampedLock与ReadWriteLock并没有很大的区别。
需要注意的是,这里我写的是乐观读,而不是乐观读锁,因为乐观读是不加锁的。通过tryOptimisticRead()函数获取一个stamp,这里的tryOptimisticRead() 就是乐观读,乐观读因为没有加锁,所以读取数据的性能会更高一点。即:已经有写操作线程加锁的同时,仍然允许读操作线程继续进行。
如果你的读写操作有比较强的时间点数据一致性要求,即:同一个时间点读操作读到的数据,一定与该时间点写操作保持数据一致性。那么,你就需要进行validate校验,stamp此时可以理解为一个版本号,如果写操作版本为2,读操作版本为1,说明你读到的数据不是最新的。你需要去读取最新版本的数据(版本号为2),所以需要升级为悲观读锁,代码如下:
public String readWithOptimisticLock(String key) {
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/dc20783e4fa18f2636116343066689a7.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/79993137ef4ba82ded908aee0e5d60b4.png)
![img](https://img-blog.csdnimg.cn/img_convert/9368e688893edb361eb36c29285cd634.png)
![img](https://img-blog.csdnimg.cn/img_convert/ffecfdc2e894b719e68d3ddfdba3918d.png)
![img](https://img-blog.csdnimg.cn/img_convert/95faebd98db49dcfbe9eba4f351d740b.png)
![img](https://img-blog.csdnimg.cn/img_convert/b5708eb75e2f78068e1da38ac7b7d59d.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)**
![img](https://img-blog.csdnimg.cn/img_convert/b06a387a662ef736debec7008871fd41.jpeg)
# Spring全套教学资料
**Spring是Java程序员的《葵花宝典》,其中提供的各种大招,能简化我们的开发,大大提升开发效率!目前99%的公司使用了Spring,大家可以去各大招聘网站看一下,Spring算是必备技能,所以一定要掌握。**
**目录:**
![](https://img-blog.csdnimg.cn/img_convert/b1aeca4a0ec58c07f0a98ccfbb5b929f.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/0261b17ef45ea9eec81dbaaf3bda741f.webp?x-oss-process=image/format,png)
**部分内容:**
![](https://img-blog.csdnimg.cn/img_convert/5b76606b9aec81131f5742f853ebe91f.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/1dab220c289be72ea50115bd9d042c32.webp?x-oss-process=image/format,png)
# Spring源码
* 第一部分 Spring 概述
* 第二部分 核心思想
* 第三部分 手写实现 IoC 和 AOP(自定义Spring框架)
* 第四部分 Spring IOC 高级应用
基础特性
高级特性
* 第五部分 Spring IOC源码深度剖析
设计优雅
设计模式
注意:原则、方法和技巧
* 第六部分 Spring AOP 应用
声明事务控制
* 第七部分 Spring AOP源码深度剖析
必要的笔记、必要的图、通俗易懂的语言化解知识难点
![](https://img-blog.csdnimg.cn/img_convert/6fe6a2a4c72decadb1e180e0cc5c088f.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/031097652e473bbb6f19622519f6e98f.webp?x-oss-process=image/format,png)
# 脚手框架:SpringBoot技术
> 它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署。
>
> Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。
* SpringBoot入门
* 配置文件
* 日志
* Web开发
* Docker
* SpringBoot与数据访问
* 启动配置原理
* 自定义starter
![](https://img-blog.csdnimg.cn/img_convert/6e97d599445264303dd882c3d55ac517.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/40e8168872bb973f0ad971f27d5b92a2.webp?x-oss-process=image/format,png)
# 微服务架构:Spring Cloud Alibaba
> 同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
* 微服务架构介绍
* Spring Cloud Alibaba介绍
* 微服务环境搭建
* 服务治理
* 服务容错
* 服务网关
* 链路追踪
* ZipKin集成及数据持久化
* 消息驱动
* 短信服务
* Nacos Confifig—服务配置
* Seata—分布式事务
* Dubbo—rpc通信
![](https://img-blog.csdnimg.cn/img_convert/01f8c523f8a0156aef22980521b2d6f8.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/1aa41fcf19747afced63ef8c58cd5f5f.webp?x-oss-process=image/format,png)
# Spring MVC
**目录:**
![](https://img-blog.csdnimg.cn/img_convert/1de172376de9dbc20de8f3679cdf4930.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/6e6db8708da7293144c39d9510889f65.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/b3d241efb0cb672ae0d77a81791ccdc3.webp?x-oss-process=image/format,png)
**部分内容:**
![](https://img-blog.csdnimg.cn/img_convert/fb431fefc042e10bda8908515047e37f.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/16cc45bd0566a6442f06c282d2517f92.webp?x-oss-process=image/format,png)
[**一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)
**AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**
5a486d4c3ab8389e65ecb71ac0)
**AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**