《Java后端知识体系》系列
陈汤姆
一只叫做汤姆的程序员
展开
-
分析TCP中的粘包拆包
在网络编程中,我们经常会使用各种网络传输协议,其中 TCP 是最常用的协议。 而粘包拆包就是发生在TCP中的现象,那么粘包拆包到底是什么呢?为什么有拆包/粘包TCP 是传输协议是面向流的,没有数据包界限。客户端向服务端发送数据时,可能将一个完整的报文拆分成多个小报文进行发送,也可能将多个报文合并成一个大的报文进行发送。因此就有了拆包和粘包。为什么会出现拆包粘包现象呢?在网络通信的过程中,每次可以发送的数据包大小是受多种因素限制的,如 MTU 传输单元大小、MSS 最大分段大小、滑动窗口等。如果一原创 2020-12-22 10:04:21 · 210 阅读 · 0 评论 -
Java Agent与ASM字节码介绍
Java AgentJava Agent是jdk1.5以后引入的,也叫做Java代理。javaAgent是运行方法之前的拦截器。我们利用javaAgent和ASM字节码技术,在JVM加载class二进制文件的时候,利用ASM动态的修改加载的class文件,在监控的方法前后添加计时器功能,用于计算监控方法耗时,同时将方法耗时及内部调用情况放入处理器,处理器利用栈先进后出的特点对方法调用先后顺序做处理,当一个请求处理结束后,将耗时方法轨迹和入参map输出到文件中,然后根据map中相应参数或耗时方法轨迹中的关原创 2020-11-18 18:36:45 · 3303 阅读 · 0 评论 -
Apache Druid初识
角色OverloadOverload是MiddleManager的master节点,负责索引任务管理MiddleManager索引节点。负责处理索引任务(数据导入)将数据转换为列式存储,负责实时segement的查询。CoodinatorCoodinator是Historical的master节点,负责负载混哼,确保Segement在历史节点之间尽量均衡。Historical历史节点,负责将Segemt加载到本地,负责历史Segement的查询Broker查询节点,负责接受Client查原创 2020-11-18 18:28:20 · 371 阅读 · 0 评论 -
学习Netty的基本组件及实现流程
一、通信组件在Netty中有网络通信层负责网络之间的通信,在Netty中的网络通信层中存在Bootstrap以及ServerBootstrap两个组件。1.1、ServerBootstrapServerBootstrap用于服务端,会绑定两个EventLoopGroup,分别为BossEventLoopGroup以及WorkerEventLoopGroup,Boss用于接收新的客户端,Worker用户处理连接。EventLoopGroup boss = new NioEventLoopGroup原创 2020-11-06 16:50:35 · 203 阅读 · 0 评论 -
失效策略:缓存淘汰策略有哪些?
说到失效策略就要知道失效的是什么以及通过什么方式失效?本文涉及知识比较浅,能让你知道什么是LRU以及类似的共享策略,最后用代码具体实现了LRU策略。首先我们知道在计算机中内存是有限的,这就导致了我们存储数据时会出现内存过载的情况,那么此时就需要通过一定的策略将在内存中的数据剔除一部分,空出的部分储存新数据,这就用到了失效策略。对于失效策略我们平时也会接触,比如1、FIFO(First In First Out):先进先出策略,这个就是队列中最长被记住的,先进入的数据先被淘汰。2、LFU.原创 2020-11-06 16:42:31 · 695 阅读 · 0 评论 -
Elasticsearch的分布式存储与分片内部原理
1、文档如何存储1.1、分片与路由当索引一个文档的时候,文档会被存储到一个主分片中。 Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?当我们创建文档时,它如何决定这个文档应当被存储在分片 1 还是分片 2 中呢?首先这肯定不会是随机的,否则将来要获取文档的时候我们就不知道从何处寻找了。实际上,这个过程是根据下面这个公式决定的shard = hash(routing) % number_of_primary_shardsrouting 是一个可变值,默认是文档的 _id ,也可以原创 2020-11-06 16:34:20 · 976 阅读 · 0 评论 -
Redis知识点全面汇总
系列文章目录文章目录系列文章目录前言一、数据结构1.字符串2.链表3.字典4.跳跃表5.整数二、持久化机制1.RDB2.AOF三、主从复制旧版:SYNC1、同步2、命令传播新版:PSYNC1、完整重同步2、部分重同步四、哨兵概念:实现:五、集群过程:六、事务实现方法过程WATCH命令实现七、缓存三大问题缓存雪崩缓存穿透缓存击穿八、分布式锁总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学原创 2020-09-17 17:36:34 · 893 阅读 · 0 评论 -
还不懂Redis事务?看看我的总结应该就懂了
Redis事务原理分析文章目录Redis事务原理分析前言二、事务的分析三、事务的实现3.1、事务的开始3.2、命令入队3.3、事务队列3.4、执行事务四、WATCH命令的实现4.1、使用WATCH命令监视数据库键4.2、监视机制的触发4.3、判断事务是否安全五、总结5.1、错误命令问题5.2、执行过程中发生错误问题5.3、服务器停机问题前言最近一直在看书,但是看书自己也依然是个菜鸡(我好难),我也想成为大佬。# 一、事务事务是一种特性,可以理解为将多个命令打包为一个事务执行的情况原创 2020-09-04 23:04:44 · 411 阅读 · 0 评论 -
面试问我HashMap原理,我从源码详细分析hashMap的实现原理
**Map、AbstractMap、HashMap对应关系:**原创 2020-09-02 21:56:25 · 256 阅读 · 0 评论 -
从ReentrantLock的实现看AQS的原理
从ReentrantLock的实现看AQS的原理及应用文章目录从ReentrantLock的实现看AQS的原理及应用前言一、ReentrantLock二、AQS三、源码分析1.void lock方法(获取锁)非公平锁代码实现:公平锁代码实现:2.addWaiter方法(线程加入同步队列操作)3.boolean trylock()方法(尝试获取锁)4.void unlock方法(释放锁)5.cancelAcquire方法(取消节点)总结参考资料前言一、ReentrantLockReen原创 2020-08-26 11:24:58 · 482 阅读 · 0 评论 -
《Java后端知识体系》之Redis哨兵学习(二)
Redis哨兵学习文章目录Redis哨兵学习前言一、实现过程1.启动初始化Sentinel2.获取主服务器信息3.获取从服务器信息4.向主服务器和从服务器发送信息5.接收来自主服务器和从服务器的频道信息6.检测主观下线状态7.检查客观下线状态8.选举领头Sentinel9.故障转移总结前言学习Redis哨兵是如何实现的一、实现过程1.启动初始化Sentinel在Redis中启动Sentinel可以使用命令来启动,命令如下:代码如下(示例):redis-sentinel /pat原创 2020-08-23 22:28:20 · 98 阅读 · 0 评论 -
《Java后端知识体系》之Redis集群的实现原理
Redis集群学习文章目录Redis集群学习前言一、基本介绍?二、节点1.概念2.如何使用3.如何启动节点?4.节点结构是咋样的?5.CLUSER MEET命令的具体实现?总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、基本介绍?Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进原创 2020-08-23 22:15:00 · 287 阅读 · 0 评论 -
《Java后端体系系列》之网络通信框架Netty学习(一)
学习网络通信框架Netty总结1、BIO1.1、概念BIO是同步阻塞模型,服务实现模式为一个连接一个线程。即客户端有连接请求时服务器就会启动一个线程进行处理。即使这个连接不做任何事,也会保持连接状态。这样的情况会造成不必要的线程开销。1.2、场景BIO方式适用于连接数较少且固定的架构,这种方式对服务器资源要求较高,并发局限于应用中,JDK1.4之前唯一的选择。1.3、实现流程工作原理图:1)服务端启动一个ServerSocket2)客户端启动启动Socket对服务器进行通信,默认情况.原创 2020-08-11 22:09:58 · 434 阅读 · 0 评论 -
《深入理解Java虚拟机》一书总结(一)
1、概念1.1、首先说何为Java虚拟机?Java虚拟机从字面意思直接理解就是运行Java的虚拟机器,既然是虚拟的,那么就是从物理层面来说是不存在于实际的一个机器,它不像电脑这种机器,是实际存在的,而是人们想象的一个机器,因为它能像机器一样做机器可以做的事情。1.2、为什么要使用Java虚拟机我们都知道Java语言是一种高级语言,我们可以从Java语言的特性中进行分析,Java特性包括面向对象、平台独立性、可移植性、支持多线程等。从列出的特性中我们可以从可移植性进行分析。可移植性可原创 2020-08-08 23:07:25 · 127 阅读 · 0 评论 -
《Java后端知识体系》之Redis的哨兵(Sentinel)分析(一)
一、介绍Sentinel(哨兵、哨岗)是Redis的高可用性的解决方案,由一个或多个Sentinel实例(instance)组成的Sentinel系统可以监视多个主服务器,以及这些主服务器下的所有从服务器。Sentinel监视的主服务器下线(断开连接)时,可以自动将该主服务器下的某个从服务器设置为新的主服务器,然后由新的主服务器代替断开连接的主服务器处理命令请求。Sentinel系统监视服务器的例子如下:该图中server1表示主服务器,server2、server3、server4表示主服务器下原创 2020-08-07 23:34:39 · 194 阅读 · 0 评论 -
《Java后端知识体系》之Redis如何实现主从复制还不懂?看完这篇就全懂了!!!
前面介绍了Redis的持久化机制,那么现在就开始学习Redis的主从复制的功能,学习Redis的主从复制的底层实现原理,那么以后面试也可以多说说这部分知识了!!在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称被复制的服务器为主服务器(master),而对主服务器进行复制的服务器为从服务器(slave)。例如:现在有两个Redis服务器,地址分别为127.0.0.1:6379和127.0.0.1:6377,如果.原创 2020-08-05 22:14:28 · 210 阅读 · 0 评论 -
《Java后端知识体系系列》之Redis持久化AOF(二)
上一节中知道了AOF是如何进行持久化保存的(保存操作Redis的写命令),还可以通过设置appendfsync来进行不同的持久化行为(always、everysec、no)三个行为不同的持久化结果。1、AOF文件的载入与数据还原因为AOF文件里面包含了重建数据库所需要的所有写命令,所以服务器只要读入重新执行一遍AOF文件里面的命令,就可以还原服务器关闭之前的数据库状态。Redis读取AOF文件并还原数据库的详细步骤如下:创建一个不带网络连接的伪客户端(fake client):因为Redis的命原创 2020-08-04 22:07:38 · 238 阅读 · 0 评论 -
《Java后端知识体系系列》之Redis持久化AOF(一)
最近一直在看《Redis的设计与实现》一书,做的一些总结吧,以便以后自己复习Redis的知识。一、介绍除了RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。例如:redis>SET msg "hello"OKredis>SADD fruits "apple" "banana" "cherry"OKred.原创 2020-08-03 21:51:14 · 193 阅读 · 0 评论 -
《Java后端知识体系系列》之Redis的RDB持久化(二)
一、间隔性保存1.1 配置在上一节中知道了SAVE和BGSAVE两个命令的区别:SAVE命令由服务器进程执行保存工作,BGSAVE命令由子进程执行保存工作,所以SAVE命令会阻塞服务器,BGSAVE命令则不会。因为BGSAVE命令可以在不阻塞服务器进程的情况下执行,所以Redis允许用户通过设置服务器配置的save选项,让服务器每隔一段时间自动执行依次BGSAVE命令。通过save选项设置多个保存条件,但是只要其中一个条件被满足,服务器就会执行BGSAVE命令。例如,想服务器中提供了三种save选原创 2020-08-02 19:24:31 · 134 阅读 · 0 评论 -
《Java后端知识体系系列》之Redis的RDB持久化(一)
1.介绍1.1什么是数据库状态Redis是一个键值对数据库服务器,服务器中包含任意个非空数据库,而每个非空数据库中又包含任意个键值对,为了方便起见我们将服务器中的非空数据库以及他们的键值对统称为数据库状态。1.2为什么要进行持久化?Redis是内存数据库,它的数据都保存在内存中,所以如果不将内存中的数据保存到磁盘中,那么一旦Redis进程退出,那么内存中保存的数据也会丢失,所以Redis提供了RDB持久化功能。1.3什么是RDB?RDB是Redis提供的持久化功能,这个功能可以将Redis在内存原创 2020-07-30 21:32:31 · 170 阅读 · 0 评论 -
《Java后端体系系列》之Redis跳跃表是如何跳的
原文发布在语雀一、定义跳跃表是一种有序的数据结构,它通过在每个节点中维持多个指向其它节点的指针来达到快速访问节点的目的。如下图:节点1有指向节点2、节点3、节点4的指针,这样如果要访问节点4的数据,节点1可以直接通过指向节点4的指针来快速查询节点4的数据,而不需要依次遍历所有的节点。跳跃表的时间复杂度平均位OlogN,最坏为O(N)。在大多数情况下跳跃表的效率可以和平衡树相媲美,并且跳跃表的实现比平衡树更加简单。下图中实现了两个数据结构,平衡树和跳跃表(跳跃表中的数据是顺序存储)如果要原创 2020-07-29 13:08:38 · 133 阅读 · 0 评论 -
《Java后端知识体系》之Redis的整数集合底层实现
1.整数集合简述整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。例如当我们创建只包含五个元素的集合键,并且集合键中所有元素都是整数值,那么这个集合键的底层实现就会是整数集合:redis>SADD 1 2 3 4 6(integer) 5reids>OBJECT ENCODING numbers"intset"2.整数集合的实现整数集合是Redis用于保存整数值的集合抽象数据结构,它可以保原创 2020-07-27 14:44:38 · 126 阅读 · 0 评论 -
《Java后端知识体系》之理解Restful架构
知之为知之,不知为不知,是知也!Restful架构一、什么是Restful来自百度百科RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。二、起源REST全程是Representational State Transfer的缩写,翻译过来就是表现层状态转换(摘自),如果一个应用程序应用了该架构,那.原创 2020-07-26 22:37:21 · 250 阅读 · 0 评论 -
《Java后端知识体系》之带你初识什么是zookeeper及其它的选举过程
知之为知之,不知为不知,是知也!Zookeeper角色Leader:主要负责处理事务相关的操作,负责给Follower发布命令,处理Follower的反馈信息负责同步消息,将消息同步到Follower中可以保证事务处理的顺序性负责投票的发起以及更新系统的状态Follower:负责参与投票选举Leader参与事务的Proposal请求的投票将事务的执行结果反馈给LeaderObserver:作为观察者不参与Leader的选举负责将客户端的写请求转发给Leader.原创 2020-07-25 23:48:37 · 185 阅读 · 0 评论 -
《Java后端知识体系》之带你认识Paxo算法是如何选举的?
知之为知之,不知为不知,是知也!今天学习zookeeper涉及到了其中的paxos算法,抽空研究了一下paxos算法是如何进行选举的!角色Proposer提议者:负责提出议案,也就是value(vaue是paxos协议中将操作统一抽象为value)。Acceptor批准者:负责处理proposer提出的议案,proposer提出的议案必须获得半数以上的acceptor的批准才能通过。Learner学习者:不参与选举,主要参数相关的状态同步流程。选举流程流程图如下:具.原创 2020-07-24 22:45:04 · 299 阅读 · 0 评论 -
《Java后端知识体系》系列之从源码让你明白Spring是如何解决循环依赖的?
怎么出现循环依赖的异常呢?写了一个例子来实现?@Componentpublic class ModelA { private ModelB modelB; @Autowired public ModelA(ModelB modelB){ this.modelB = modelB; }}@Componentpublic class ModelB { private ModelA modelA; @Autowired publi原创 2020-07-22 18:58:42 · 102 阅读 · 0 评论 -
《Java后端知识体系》系列之看完这篇你就懂了Dubbo为何物?它要干什么?
Dubbo介绍以及应用场景?Dubbo是一个分布式、高性能、透明化的RPC框架,提供服务自动注册、自动发现等高效服务治理方案,可以和Spring无缝集成。Dubbo主要应用于:1、透明化的远程方法调用,就像调用本地方法一样调用远程方法,通过简单的配置来实现2、软服务均衡以及容错机制3、服务注册与发现,注册中心基于接口名称查询provider的ip地址,并且可以添加或者删除provider。Dubbo核心功能?Dubbo有三大核心功能:Remoting:网络通信框架,提供对多种NIO框架原创 2020-07-17 23:09:41 · 281 阅读 · 0 评论 -
《Java后端知识体系》系列之ThreadLocal原理解析
ThreadLocal的原理解析ThreadLocal:ThreadLocal概念:多线程访问同一个共享变量时容易出现并发问题,特别是多个线程需要对一个共享变量写入时, 为了保证线程安全,在访问共享变量时需要进行适当的同步。同步的措施一般是加锁,但是使用加锁的方式增加了性能的损耗,因此可以使用ThreadLocal来实现。ThreadLocal是JDK提供的,提供了线程本地变量,也就是如果创建了一个TreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本。原创 2020-07-14 19:02:25 · 143 阅读 · 0 评论 -
《Java后端知识体系》系列之Redis数据结构的底层实现
我们知道Redis中有五种数据结构:String、Map、List、Set、ZSet,那么这些数据结构在Redis中又是如何实现的呢?String(动态字符串)介绍SDS:SDS是什么?在Redis中并没有直接使用C语言的字符串(以空字符结尾的字符数组),而是构建了一种名为简单动态字符串(SDS)的抽象类型,并且SDS用作Redis的默认字符串。在Redis中一个可以被修改的字符串值都是用SDS来表示这样一个字符串值的,因此在Redis中键值对的底层都是由SDS来实现的。举.原创 2020-07-10 15:24:52 · 170 阅读 · 0 评论 -
《Java后端知识体系》系列之线程池ThreadPoolExecutor原理探究
线程池1、介绍使用线程池主要解决两个问题:当执行大量异步操作时线程池能够提供较好的性能。(不使用线程池时需要new一个线程来运行,而线程的创建和销毁都是需要耗费性能的。)线程池中的线程是可以复用的,不需要每次执行异步任务时都创建和销毁线程。线程池提供了资源限制和管理手段,比如线程线程的个数,动态新增线程等。另外线程池也提供了许多可调参数和可扩展性接口,以满足不同情景的需要,程序员可以使用Executors的工厂方法,比如newCachedThreadPool(线程池个数可以达到达 Inte原创 2020-07-09 23:06:29 · 180 阅读 · 0 评论 -
《Java后端知识体系》系列之Atomic原子类
最近参加了公司的王者荣耀比赛,一直开黑都忘记整理知识了,肥宅肥宅,希望能拿到一部Iphone 11 pro max(虽然根本不可能)JUC并发包提供一系列的原子性操作,这些类都是使用非阻塞算法CAS实现的,相比使用锁实现原子性操作这在性能上有很大 的提高。JUC并发包中含有AtomicInteger、AtomicLong和AtomicBoolean等原子操作类。以AtomicLong为例。public class AtomicLong extends Number implements java..原创 2020-07-06 23:06:41 · 285 阅读 · 0 评论 -
《Java后端知识体系》系列之Semaphore的原理剖析
Semaphore原理刨析场景:Semaphore信号量也是Java中的一个同步器,与CountDownLatch和CycleBarrier不同的是它内部的计数器是递增的,并且一开始初始化Semaphore时可以指定一个初始值,但是并不需要知道需要同步的线程个数,而是在需要同步的地方调用acquire方法时指定需要同步的线程个数。代码实现如下:public class SemaphoreTest { private static volatile Semaphore semap..原创 2020-07-02 23:00:30 · 206 阅读 · 0 评论 -
《Java后端知识体系》系列之CyclicBarrier的原理剖析
每晚整理知识点都要整理到十一点,时间慢一点啊,我整理不过来啊!还有一堆redis的文章要整理。。。。CyclicBarrier原理刨析场景:CountDownLatch的计数器是一次性的,也就是计数器值变为0之后,再调用CountDownLatch的await和countdown方法都会返回,这就起不到线程同步的效果,所以为了满足计数器可以重置的需要,这里就需要使用CyclicBarrier。CyclicBarrier是回环屏障的意思,它可以让一组线程全部达到一个状态后再全部同时执行,.原创 2020-06-30 23:01:09 · 179 阅读 · 0 评论 -
《Java后端知识体系》系列之CountDownlatch的原理剖析
知识没有狗粮来的直接,所以先上狗粮!线程同步器CountDownlatch原理刨析场景:在日常开发中会遇到需要在主线程中开启多个线程去并行执行任务,并且主线程需要等待所有的子线程执行完毕后再进行汇总的场景,对于这种情况在CountDownLatch之前一般使用线程的join()方法来实现此需求,但是join方法不够灵活,不能满足场景需要,因此有了CountDownLatch。实现方式如下:public class CountDownLatch2 { private .原创 2020-06-29 23:04:29 · 137 阅读 · 0 评论 -
《Java后端知识体系》系列之共享锁 ReentrantReadWriteLock的原理
上次说了ReentrantLock这次说ReentrantReadWriteLock解决线程安全问题使用ReentrantLock,但是ReentrantLock是独占锁,同一时刻只有一个线程可以获得锁,而实际中会有写多读少的场景,因此ReentrantLock满足不了这个需求,所以ReentrantReadWriteLock应运而生,ReentrantReadWriteLock采用读写分离策略,允许多个线程同时获得锁。以下是ReentrantReadWriteLock的类图从类图中我们可以看到.原创 2020-06-17 23:08:26 · 197 阅读 · 0 评论 -
《Java后端知识体系》系列之独占锁 Reentrant Lock 的原理
周末两天跟女朋友出去high了一下,所以自己的知识整理也搁置了两天,手动狗头!ReentrantLock概览ReentrantLock是可重入的独占锁,所以只能有一个线程获得该锁,,其它获取该锁的线程会被阻塞而被放入该锁的AQS阻塞队列中,以下是ReentrantLock的类图。从以上类图中可以看到,ReentrantLock最终还是使用AQS来实现的,并且根据参数来决定其内部是一个公平锁还是非公平锁,默认是非公平锁。public ReentrantLock(){ sync = new No.原创 2020-06-15 21:25:56 · 213 阅读 · 0 评论 -
《Java后端知识体系》系列之自定义AQS同步器
/** * @author admin */public class NonReentrantLock implements Lock, Serializable { protected static class Sync extends AbstractQueuedSynchronizer{ //是否锁已经被持有 @Override protected boolean isHeldExclusively(){ retu原创 2020-06-09 22:41:37 · 201 阅读 · 0 评论 -
《Java后端知识体系》系列之AQS详解
概览:在并发编程中不得不提到的就是AQS(AbstractQueueSynchronizer)抽象同步队列,它是实现同步器的基础组件,并发包中锁的底层实现就是使用AQS来实现的。AQS的结构图如下:从该图中可以看到AQS是一个FIFO(先进先出)双向队列,其内部节点通过head和tail记录队首和队尾元素,队列元素的类型为Node,其中Node中的thread变量用来存放AQS队列中的线程;Node节点内部的SHARED用来标记该线程是获取共享资源时被阻塞挂起后放入AQS队列的,EXCLUSIV原创 2020-06-07 22:10:17 · 270 阅读 · 0 评论 -
《Java后端知识体系》系列之JUC并发包
java.util.concurrent 类库中提供了 Condition 类来实现线程之间的协调,可以在 Condition 上调用 await() 方法使线程等待,其它线程调用 signal() 或 signalAll() 方法唤醒等待的线程。相比于 wait() 这种等待方式,await() 可以指定等待的条件,因此更加灵活。使用 Lock 来获取一个 Condition 对象。public class AwaitSignalExample {private Lock lock = new R转载 2020-06-04 22:15:27 · 272 阅读 · 0 评论 -
《Java后端知识体系》系列之并发编程基础(三)锁的概述(悲观锁、乐观锁、公平锁、非公平锁、独占锁、共享锁、自旋锁)
最近深究并发编程的文章,看一点总结一点,也不算总结,就是把自己觉得有用的抄下来,对几个月后的面试希望有帮助!!锁的概述悲观锁与乐观锁悲观锁:悲观锁是数据对外界的修改保持保守的态度,认为数据会被其它线程修改,所以每次对数据做处理时都会加锁,并且处理数据过程中数据也处于锁定状态。实现方法:Java中的synchronized锁以及lock锁都是悲观锁。乐观锁:乐观锁相对于悲观锁来说,认为数据在一般情况下并不会造成冲突,所以访问数据时并不会加入排他锁,而是在数据提交更新时,才会对验证数据.原创 2020-06-02 22:14:29 · 227 阅读 · 0 评论