学习之路
文章平均质量分 72
Sinb妃
这个作者很懒,什么都没留下…
展开
-
Redis 过期键删除策略及缓存淘汰策略
Redis作为缓存,对应的key值可以设置expire的过期时间,与此对应的,其也有三种过期键的淘汰删除策略。一、过期键删除策略1、定时删除含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时对key进行删除;优点: 保证内存被尽快释放缺点:若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会原创 2021-10-07 15:44:26 · 407 阅读 · 0 评论 -
Http协议详解
Http协议一、网络基础 TCP/IP通常使用的网络(包括互联网)是在 TCP/IP 协议族的基础上运作的。而 HTTP 属于它内部的一个子集。1、TCP/IP 的分层管理TCP/IP 协议族里重要的一点就是分层。TCP/IP 协议族按层次分别分为以下 4 层:应用层、传输层、网络层和数据链路层。把 TCP/IP 层次化是有好处的。比如,如果互联网只由一个协议统 筹,某个地方需要改变设计时,就必须把所有部分整体替换掉。而分层之后只需把变动的层替换掉即可。把各层之间的接口部分规划好之后,每个层次内部原创 2021-09-29 11:35:04 · 669 阅读 · 0 评论 -
ThreadLocal类详解
文章目录ThreadLocal类详解一、简介二、数据结构三、ThreadLocalMap的Hash算法四、ThreadLocal原理详解五、ThreadLocalMap过期key的清理流程六、ThreadLocal的扩容机制七、内存泄漏的避免方法ThreadLocal类详解一、简介从名字我们就可以看到ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内原创 2021-08-03 14:58:56 · 316 阅读 · 0 评论 -
stream.sorted()多字段排序及foreach的参数问题
写一点今天在写代码时遇到的问题:1、使用stream流时多字段的排序问题(1)多字段排序:使用Comparator.comparing,此时会对第一字段进行排序,如果第一字段相等,此时进入第二字段的排序Comparator.comparing().thenComparing(),接着,第三个字段···第n个字段均可使用.thenComparing()来实现;value.stream() .sorted(Comparator.comparing(TreeNodeAndIndex::getRow原创 2021-08-01 18:34:29 · 7051 阅读 · 0 评论 -
Redis数据结构的实现
Redis数据结构的实现一、String(simple dynamic string SDS 简单动态字符串) Redis默认并未直接使用C字符串(C字符串仅仅作为字符串字面量,用在一些无需对字符串进行修改的地方,如打印日志)。而是以Struct的形式构造了一个SDS的抽象类型。当Redis需要一个可以被修改的字符串时,就会使用SDS来表示。在Redis数据库里,包含字符串值的键值对都是由SDS实现的(Redis中所有的键都是由字符串对象实现的即底层是由SDS实现,Redis中所有的值对象中包含的字符原创 2021-07-29 17:42:34 · 116 阅读 · 0 评论 -
Redis数据结构的实现
Redis数据结构的实现一、String(simple dynamic string SDS 简单动态字符串) Redis默认并未直接使用C字符串(C字符串仅仅作为字符串字面量,用在一些无需对字符串进行修改的地方,如打印日志)。而是以Struct的形式构造了一个SDS的抽象类型。当Redis需要一个可以被修改的字符串时,就会使用SDS来表示。在Redis数据库里,包含字符串值的键值对都是由SDS实现的(Redis中所有的键都是由字符串对象实现的即底层是由SDS实现,Redis中所有的值对象中包含的字符原创 2021-07-28 19:11:16 · 268 阅读 · 0 评论 -
计算机网络
OSI参考模型应用层 为应用程序提供服务并规定应用程序中通信相关的细节。包括文件传输、电子邮件、远程登录(虚拟终端)等协议。表示层 将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式。因此它主要负责数据格式的转换。具体来说,就是将设备固有的数据格式转换为网络标准传输格式。 不同设备对同一比特流解释的结果可能会不同。因此,使它们保持一致是这一层的主要作用。会话层负责建立和断开通信连接(数据流动的逻辑通路),以及数据的分割等数据传输相关原创 2021-07-28 16:37:18 · 452 阅读 · 0 评论 -
jvm 类加载过程
一、类加载的生命周期加载->验证->准备->解析->初始化->使用->卸载;初始化的时机:主要是分为主动初始化和被动初始化两种情况;主动初始化:当类还未初始化过时,我们主动使用new,使用类的静态字段,静态方法的时候;被动初始化:(1)对类进行反射调用,类尚未初始化;(2)初始化类时,其父类尚未初始化,先触发父类初始化;(3)调用主类main方法时,先对主类进行初始化;二、类加载过程1、加载:(1)根据类的全限定名获取其二进制字节流;(2)将二原创 2021-07-10 23:07:23 · 1020 阅读 · 3 评论 -
LeetCode 1418. 点菜展示表
给你一个数组 orders,表示客户在餐厅中完成的订单,确切地说,orders[i]=[customerNamei,tableNumberi,foodItemi] ,其中 customerNamei是客户的姓名,tableNumberi 是客户所在餐桌的桌号,而 foodItemi 是客户点的餐品名称。请你返回该餐厅的 点菜展示表 。在这张表中,表中第一行为标题,其第一列为餐桌桌号 “Table”,后面每一列都是按字母顺序排列的餐品名称。接下来每一行中的项则表示每张餐桌订购的相应餐品数量,第一列应.原创 2021-07-06 22:36:29 · 91 阅读 · 0 评论 -
ElasticSearch学习笔记(五) 深入搜索
一、查询与过滤1、过滤:当使用于 过滤情况 时,查询被设置成一个 “不评分”或者“过滤”查询。 即,这个查询只是简单的问一个问题:“这篇文档是否匹配?”。回答也是非常的简单,yes 或者 no ,二者必居其一。created 时间是否在 2013 与 2014 这个区间?status 字段是否包含 published 这个单词?lat_lon 字段表示的位置是否在List item指定点的 10km 范围内?2、查询: 当使用于 查询情况 时,查询就变成了一个“评分”的查询。 和不评分的查原创 2021-06-08 19:03:24 · 94 阅读 · 0 评论 -
ElasticSearch学习笔记(四) 检索相关
查询字段解析:_search:我们可以使用_search API来检索查询索引。搜索API的最基础的形式是没有指定任何查询的空搜索,它简单地返回集群中所有索引下的所有文档:GET /_search返回结果如图:{ "hits" : { "total" : 14, "hits" : [ { "_index": "us", "_type": "tweet", "_id":原创 2021-06-08 18:49:19 · 98 阅读 · 0 评论 -
elasticSearch学习笔记(三) 索引相关
建立索引PUT my_index{//设置分片和副本 "settings": { "number_of_shards" : 5, "number_of_replicas" : 1 },//建立相关映射 "mappings": { "_doc": { "properties": { "text": { "type": "text" } } }原创 2021-06-08 17:43:15 · 122 阅读 · 0 评论 -
ElasticSearchd学习笔记(二)Mapping映射
映射(Mapping): 映射定义了文档和它所包含的属性被存储类型和索引方式等等举例来说,我们用映射来定义以下信息:是否一个字符串应该被当成全文类型来存储和索引。属性是整形、字符型、日期类型还是地理位置类型。是否一个属性应该被包含在_all元数据中。日期类型属性的格式化。自定义动态添加的属性的映射。动态映射字段的数据类型在加入索引之前不需要事先定义,Elasticsearch会根据文档字段自动识别类型创建映射。不仅首次加入数据到索引时Elasticsearch会自动创建映射,新的字段首原创 2021-06-08 17:03:17 · 210 阅读 · 0 评论 -
ElasticSearch学习笔记(一)基本概念
什么是ElasticSearchElaticSearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单 .什么是全文检索全文检索:将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行原创 2021-06-08 16:14:57 · 89 阅读 · 0 评论 -
Mybatis分页插件使用方法
一、引入相关jar包二、配置PageHelper方言三、编写业务逻辑使用PageHelper.startPage 静态方法调用startPage :特点:静态方法,传递两个参数(当前页码,每页查询条数)使用pageHelper 分页的时候,不再关注分页语句,查询全部的语句自动的对PageHelper.startPage 方法下的第一个sql 查询进行分页PageHelper.startPage(1,5);//紧跟着的第一个select 方法会被分页List list = count原创 2021-06-08 10:41:01 · 516 阅读 · 0 评论 -
MongoDB整合springboot之基本增删查改
1、yml配置文件server: port: 8080spring: data: mongodb: uri: mongodb://localhost:27017/test2、实体类package com.example.mongodb.Pojo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import org.springframewo原创 2021-06-02 09:44:02 · 100 阅读 · 0 评论 -
spring boot整合mybatis基础操作(Restful风格接口)
1、项目结构2、yml配置文件server: port: 8080spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/dailyTrain?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC driver-class-name:原创 2021-05-31 16:27:49 · 219 阅读 · 2 评论 -
ReentrantLock类的实现原理
一、简介ReentrantLock是Java并发包中提供的一个可重入的互斥锁。ReentrantLock和synchronized在基本用法,行为语义上都是类似的,同样都具有可重入性。只不过相比原生的Synchronized,ReentrantLock增加了一些高级的扩展功能,比如它可以实现公平锁,同时也可以绑定多个Conditon。ReentrantLock是基于AQS的,AQS是Java并发包中众多同步组件的构建基础,它通过一个int类型的状态变量state和一个FIFO队列来完成共享资源的获取,原创 2021-05-17 20:33:52 · 127 阅读 · 0 评论 -
java多线程学习笔记(四) 线程池
一. 线程池简介线程池的概念:线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。线程池的工作机制2.1 在线程池的编程模式下,任务是提交给整个线程池,而不是直接提交给某个线程,线程池在拿到任务后,就在内部寻找是否有空闲的线程,如果有,则将任务交给某个空闲的线程。2.1原创 2021-04-26 18:18:00 · 95 阅读 · 0 评论 -
springboot学习笔记(五)- Thymeleaf模板引擎
一、模板引擎前端交给我们的页面,是html页面。如果是我们以前开发,我们需要把他们转成jsp页面,jsp好处就是当我们查出一些数据转发到JSP页面以后,我们可以用jsp轻松实现数据的显示,及交互等。jsp支持非常强大的功能,包括能写Java代码,但是呢,我们现在的这种情况,SpringBoot这个项目首先是以jar的方式,不是war,像第二,我们用的还是嵌入式的Tomcat,所以呢,他现在默认是不支持jsp的。那不支持jsp,如果我们直接用纯静态页面的方式,那给我们开发会带来非常大的麻烦,那怎么办呢?原创 2021-04-25 22:35:55 · 209 阅读 · 0 评论 -
springboot学习笔记(四) JSR303数据校验
1.先看看如何使用Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。我们这里来写个注解让我们的name只能支持Email格式;@Validated //数据校验public class Person { @Email(message="邮箱格式错误") //name必须是邮箱格式 private String name;}2.常见参数@NotNull(message="名字不能为空")private St原创 2021-04-25 22:11:47 · 63 阅读 · 0 评论 -
springboot学习笔记(三)- yml的使用
一、yaml语法学习:1、配置文件:SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的(1)application.properties 语法结构 :key=value(2)application.yml 语法结构:key:空格 value配置文件的作用 :修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;比如我们可以在配置文件中修改Tomcat 默认启动的端口号!测试一下!server.port=80812、基础语法原创 2021-04-25 22:02:07 · 138 阅读 · 0 评论 -
springboot学习笔记(二)- 自动配置原理
引言:SpringBoot项目无需各种配置文件,一个main方法,就能把项目启动起来。那么我们看看SpringBoot是如何进行自动配置和启动的。1. SpringBoot通过main方法启动SpringApplication类的静态方法run()来启动项目。2、这其中@SpringBootApplication注解是个复合注解,里面还包含了其他注解。其中有三个注解是比较重要的:(1)@SpringBootConfiguration:这个注解的底层是一个@Configuration注解,意思原创 2021-04-24 22:27:41 · 151 阅读 · 0 评论 -
springboot学习笔记(一)- 基本概念
一:引言Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是 Spring Boot 其实不是什么新的框架,它默认配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。使用 Spring Boot 可以非常方便、快速搭建项目,使我们不用关心框架之间的兼容性,适用版本等各种问题原创 2021-04-23 22:44:53 · 124 阅读 · 0 评论 -
JVM学习笔记-垃圾回收器
HotSpot虚拟机所包含的收集器:新生代收集器:Serial、ParNew、Parallel Scavenge老年代收集器:CMS、Serial Old、Parallel Old整堆收集器: G1几个相关概念:并行收集: 指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态。并发收集: 指用户线程与垃圾收集线程同时工作(不一定是并行的可能会交替执行)。用户程序在继续运行,而垃圾收集程序运行在另一个CPU上。吞吐量: 即CPU用于运行用户代码的时间与CPU总消耗时间的比值(吞吐量原创 2021-04-22 22:37:06 · 107 阅读 · 0 评论 -
RabbitMQ学习笔记(七)- 消息的可靠性投递
一、消费者回调在某些业务场景下,为了提高消息投递的可靠性,消费者在消费完消息后可以回调生产者API,以达到响应消息的目的。例如商业银行与人民银行二代支付通信,无论是人行收到了商业银行的消息,还是商业银行收到了人行的消息,都必须发送一条响应消息(叫做回执报文)。二、补偿机制如果生产者的API 就是没有被调用,也没有收到消费者的响应消息,怎么办?其中原因可能是消费者处理时间太长或者网络超时。生产者与消费者之间应该约定一个超时时间,比如5 分钟,对于超出这个时间没有得到响应的消息,可以设置一个定时重发原创 2021-04-22 16:41:10 · 113 阅读 · 0 评论 -
RabbitMQ学习笔记(六)- 高级特性
一、TTL(Time TO LIVE 过期时间)TTL是Time To Live的缩写, 也就是生存时间RabbitMQ支持消息的过期时间, 在消息发送时可以进行指定RabbitMQ支持队列的过期时间, 从消息入队列开始计算, 只要超过了队列的超时时间配置, 那么消息会自动清除注意:如果上述两种方法同时使用,则消息的过期时间以两者 TTL较小的那个数值为准。消息在队列的生存时间一旦超过设置的 TTL值,就称为 dead message被投递到死信队列,消费者将无法再收到该消息;代码实现:设置原创 2021-04-22 16:36:30 · 84 阅读 · 0 评论 -
RabbitMQ学习笔记(五)- 削峰实例
引言:在处理秒杀场景时经常会用到rabbitmq削峰限流作用,假设我们的系统能每秒处理1000个请求,如果有上万个请求同时打进来,会造成服务器的瘫痪。这时就需要在系统之前加一次处理,将请求发送的MQ中,再让A系统以每秒1000的速率去请求mq服务器。代码实现:配置文件:spring.application.name=springboot_rabbitmqspring.rabbitmq.host=192.168.0.102spring.rabbitmq.port=5672spring.ra原创 2021-04-21 11:44:48 · 2195 阅读 · 0 评论 -
RabbitMQ学习笔记(四)-消息确认机制
引入在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。confirm 确认模式return 回退模式一、confirm模式和Return模式(1)概念:confirm机制,消息的确认,是指生产者投递消息之后,如果Broker收到消息,则会给生产者一个应答,生产者能接收应答,用来确定这条消息是否正常的发送到Broker,这种机制是消息可靠性投递的核心保障。confirm机制是只保证消息原创 2021-04-21 11:21:39 · 282 阅读 · 0 评论 -
RabbitMQ学习笔记(三)工作模式及相应代码
一、简单模式(simple)(1)模型:P:生产者,也就是要发送消息的程序C:消费者:消息的接受者,会一直等待消息到来,这里可以设置成手动的ack,但如果设置成手动ack,处理完后要及时发送ack消息给队列,否则会造成内存溢出)。queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息生产者代码://创建连接工厂 //创建连接mq的连接工厂对象 ConnectionFactory connectionFac原创 2021-04-20 12:26:33 · 103 阅读 · 0 评论 -
RabbitMQ学习笔记(二)-Exchange相关
1、概念交换机是用来发送消息的 AMQP 实体,交换机拿到一个消息之后将它路由给一个或零个队列。它使用哪种路由算法是由交换机类型和绑定(Bindings)规则所决定的。注意:交换机可以有两个状态:持久(durable)、暂存(transient)。持久化的交换机会在消息代理(broker)重启后依旧存在,而暂存的交换机则不会(它们需要在代理再次上线后重新被声明)。2、direct直连交换机(默认交换机)(1)概念:根据消息携带的路由键(routing key)将消息投递给对应绑定键的队列。原创 2021-04-19 20:25:02 · 89 阅读 · 0 评论 -
RabbitMQ学习笔记(一)-基本概念
一、基本内容1、介绍: 实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。2、AMQP协议: AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息的网络协议。(1)工作模型:(2)工作过程:发布者(Publisher)发布消息(Message),经由交换机原创 2021-04-19 19:46:52 · 104 阅读 · 0 评论 -
Redis学习笔记(三)-重点概念
一、Redis持久化redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失。幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Append Only File)。1、RDBRDB其实就是把数据以快照的形式保存在磁盘上。什么是快照呢,你可以理解成把当前时刻的数据拍成一张照片保存下来。RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二原创 2021-04-17 22:43:11 · 186 阅读 · 0 评论 -
HashMap底层原理
一、数据结构1、数组结构: 存储区间连续、内存占用严重、空间复杂度大优点:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度快)缺点:插入和删除数据效率低,因插入数据,这个位置后面的数据在内存中都要往后移动,且大小固定不易动态扩展。2、链表结构:存储区间离散、占用内存宽松、空间复杂度小;优点:插入删除速度快,内存利用率高,没有固定大小,扩展灵活;缺点:不能随机查找,每次都是从第一个开始遍历(查询效率低);3、哈希表结构:结合数组结构和链表结构的优点,从而实现了查询和修改效原创 2021-04-16 22:51:07 · 99 阅读 · 0 评论 -
Redis学习笔记(二)-事务相关
(1)Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:批量操作在发送 EXEC 命令前被放入队列缓存。收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。(2)一个事务从开始到执行会经历以下三个阶段:开始事务;命令入队;执行事务;(3)操作实例:redis 127.0.0.1:6379> MULTIOKredis 127.0.0.1:6379>原创 2021-04-15 23:07:57 · 76 阅读 · 0 评论 -
Redis学习笔记(一)-基本概念
一、基本概念1、定义Redis(Remote Dictionary Server ),即远程字典服务。是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API;redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。2、特性(1)速度快,基于键值对的数据结构服务器;(2)丰富的功能:键过期、发布订阅、支持lua脚本、事务功能、流水线功能(批量命令)原创 2021-04-15 17:12:02 · 113 阅读 · 0 评论 -
MySQL学习笔记(三)-三大范式及BCNF
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。1、第一范式(1)定义: 要求数据库表的每一列都是不可分割的原子数据项。(2)例子:2。第二范式(1)定义: 在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)3、第三范式(1)定义: 在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖),.原创 2021-04-14 11:42:07 · 221 阅读 · 0 评论 -
MySQL学习笔记(二)-索引相关之B树与B+树
一、B树1、定义2、插入(1)插入一个元素时,首先在B树中是否存在,如果不存在,即比较大小寻找插入位置,在叶子结点处结束,然后在叶子结点中插入该新的元素;(2)如果叶子结点空间足够,这里需要向右移动该叶子结点中大于新插入关键字的元素,如果空间满了以致没有足够的空间去添加新的元素,则将该结点进行“分裂”,将一半数量的关键字元素分裂到新的其相邻右结点中,中间关键字元素上移到父结点中(当然,如果父结点空间满了,也同样需要“分裂”操作);(3)当结点中关键元素向右移动了,相关的指针也需要向右移。如果在原创 2021-04-14 11:09:53 · 144 阅读 · 0 评论 -
MySQL学习笔记(一)-事务相关
1、事务基本概念: 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。2、事务四个特性 A(原子性),C(一致性)、I(隔离性)、D(持久性)(1)原子性: 一个事务需被认为一个不可分割的最小执行单位,要么全部成功完成,要么全部失败回滚;(2)一致性: 数据库必须从一个一致性状态转移到另一个一致性状态;(3)隔离性: 一个事务的执行不能被其他事务干扰;(4)持久性: 一个事务一旦提交,其对数据库的数据的改变是永久性的。3、并发控制中事务可能出现的问题(1)丢失原创 2021-04-13 22:02:40 · 116 阅读 · 0 评论 -
java多线程学习笔记-java锁
一、引言Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录:二、各类锁介绍1、乐观锁: 乐观锁总是认为不存在并发问题,每次去取数据的时候,总认为不会有其他线程对数据进行修改,因此不会上锁。但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用“数据版本机制”或“CAS操作”来实现。(1)CAS操作: CAS(Compare and Swap 比较并交换),当多个线程尝试使用原创 2021-04-09 22:50:16 · 91 阅读 · 0 评论