自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 AQS是什么?

目录AQS是什么 AQS为什么是JUC内容中最重要的基石 进一步理解锁和同步器的关系AQS能干嘛官网解释 AQS内部体系架构 体系架构​编辑 队列结构是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石,通过内置的FIFO队列来完成资源获取线程的排队工作,并通过一个int类变量state表示持有锁的状态通过CAS完成对status值的修改(0表示没有,1表示阻塞)CLH:Craig、Landin and Hagersten 队列,是一个单向链表,AQS中的队列是CLH变体的虚拟双向队列FIF

2022-08-29 15:11:05 325

原创 Synchronized锁升级——重量级锁

Java中synchronized的重量级锁,是基于进入和退出Monitor对象实现的。在编译时会将同步块的开始位置插入monitor enter指令,在结束位置插入monitor exit指令。当线程执行到monitor enter指令时,会尝试获取对象所对应的Monitor所有权,如果获取到了,即获取到了锁,会在Monitor的owner中存放当前线程的id,这样它将处于锁定状态,除非退出同步块,否则其他线程无法获取到这个Monitor。...

2022-08-29 10:43:53 782

原创 Synchronized与锁升级——轻量级锁

轻量级锁是为了在线程近乎交替执行同步块时提高性能。主要目的:在没有多线程竞争的前提下,通过CAS减少重量级锁使用操作系统互斥量产生的性能消耗.说白了先自旋,不行才升级阻寨。

2022-08-28 23:33:50 952

原创 Synchronized锁升级——偏向锁

(处于同步块),会把原获得偏向锁的线程升级为轻量级锁后继续执行同步代码块,此时轻量级锁由原持有偏向锁的线程持有,继续执行其同步代码,而正在竞争的线程会 CAS 自旋来获得该轻量级锁,当自旋次数超过一定数量,升级为重量级锁。synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的来实现的,挂起线程和恢复线程都需要转入内核态去完成,,表示发生了竞争,锁己经不是总是偏向于同一个线程了,这个时候会尝试使用CAS来替换MarkWord里面的线程ID为新线程的ID,....

2022-08-28 20:14:32 343

原创 Java对象内存布局

在64位系统中,MarkWord占了8个字节,类型指针(没有开启压缩指针)占了8个字节,一共是16个字节,对象头16+实例数据5(int 4 ,boolean 1)+对齐填充3=24字节。填充数据不是必须存在的,仅仅是为了字节对齐这部分内存按8字节补充对齐。,开启后类型指针4字节,由于对其填充,还是会将其补到16字节。存储的是指向该对象类元数据(klass)的首地址。(Field)信息,包括父类的属性信息。+是开启,-就是关闭,所以指令是。在JVM堆里的新生代的伊甸园区。只有对象头的实例对象。.......

2022-08-28 15:46:47 360

原创 CAS是什么

CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换。CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。否则进行自选重新获取。......

2022-08-26 12:24:26 1410

原创 LockSupport之等待唤醒机制

LockSupport是什么用于创建锁和其他同步类的基本线程阻塞原语。就是park()和unpark()方法park()方法是unpark()方法是。

2022-08-24 17:39:17 220

原创 线程的中断协商机制interrupt()、isInterrupted()、interrupted()

一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的协商机制——中断。中断只是一种协作协商机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。...

2022-08-24 16:39:41 335

原创 多线程锁:可重入锁(又名递归锁)

在同一个线程在外层方法获取锁的时候,如果内部还有同步方法或者同步代码块,再进入该线程的内层方法会自动获取锁(前提,锁对象得是同一个对象),不会因为之前已经获取过还没释放而阻塞。

2022-08-23 21:50:53 322

原创 多线程锁:公平锁和非公平锁

是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁,在高并发环境下,有可能造成优先级翻转或。实现方式:ReentrantLock lock = new ReentrantLock(false);实现方式:ReentrantLock lock = new ReentrantLock(true);来获取锁,这里类似排队买票,先来的人先买后来的人在队尾排着,这是公平的。恢复挂起的线程到真正锁的获取还是有时间差的。,很显然非公平锁是比较合适的,因为。(某个线程一直得不到锁)

2022-08-23 21:02:31 315

原创 什么是缓存雪崩?怎么解决?

但当缓存中大量热点缓存采用了相同的实效时间,就会导致缓存在某一个时刻同时实效,请求全部转发到数据库,从而导致数据库压力骤增,甚至宕机。: 比如我们可以在原有的失效时间基础上增加一个随机值,比如 1-5 分钟随 机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效 的事件。: 用加锁或者队列的方式保证来保证不会有大量的线程对数据库一次性进行 读写,从而避免失效时大量的并发请求落到底层存储系统上。:nginx 缓存 + redis 缓存 +其他缓存(ehcache 等)缓存雪崩与缓存击穿的区别。

2022-08-21 14:26:31 272

原创 什么是缓存击穿?怎么解决?

key 对应的数据在数据库中存在,但在redis中过期,这个key是热门访问的key,此时有大量并发请求过来,这些请求发现缓存过期,最终会不断访问DB并回设到缓存,这个时候大并发的请求可能会瞬间把后端 DB 压垮,出现缓存击穿。举个例子:我们在某个商城购买某个热门商品。为了保证访问速度,通常情况下,商城系统会把商品信息放到缓存中。但如果某个时刻,该商品到了过期时间失效了。

2022-08-21 12:04:01 272

原创 什么是缓存穿透 ?如何解决?

一个一定不存在缓存及查询不到的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每 次请求都要到存储层去查询,失去了缓存的意义。key 对应的数据在数据源并不存在,每次针对此 key 的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户 id 获取用户信息, 不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。设置可访问的名单(白名单): 使用 bitmaps 类型定义一个可以访问的名单。

2022-08-21 11:45:43 222

原创 垃圾回收器

串行垃圾回收器分为两个部分,分开运行的。新生代空间不足了触发Serial完成MinorGC,老年代空间不足了触发SerialOld完成FullGC 垃圾回收器开启多个线程进行垃圾回收

2022-08-21 11:31:50 215

原创 垃圾回收算法、分代垃圾回收

在垃圾回收之前,我们必须确定的一件事就是对象是否存活?这就牵扯到了判断对象是否存活的算法给对象中添加一个引用计数器,每当有一个地方引用它时,计数器+1,当引用失效,计数器-1.任何时刻计数器为0的对象就是不可能再被使用的。优点:实现简单,判定效率高效,被actionscript3和python中广泛应用。缺点:无法解决对象之间的相互引用问题。java没有采纳。...

2022-08-07 10:19:18 147

原创 MVCC多版本并发控制

MVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。...

2022-08-06 14:56:45 451

原创 MySQL事务日志

事务有4种特性:原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢?事务的隔离性由锁机制实现。而事务的原子性、一致性和持久性由事务的 redo 日志和undo 日志来保证。REDO LOG 称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。UNDO LOG 称为回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。有的DBA或许会认为UNDO是REDO的逆过程,其实不然。......

2022-08-06 10:10:09 341

原创 寻找数组的中心下标

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1。数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。给你一个整数数组 nums ,请计算数组的 中心下标。......

2022-08-05 21:41:37 194

原创 删除数组中重复元素并返回数组长度

给你一个 升序排列 的数组 nums ,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致。

2022-08-05 21:29:15 387

原创 分治算法-汉诺塔

大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。分治法在每一层递归上都有三个步骤:1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题2)解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题。1)如果是有一个盘,A->C如果我们有n>=2情况,我们总是可以看做是两个盘1.最下边的盘2.上面的盘。3)把最下边的盘A->C4)把B塔的所有盘从B->C。......

2022-08-04 15:51:28 1086

原创 二分查找(Java)

二分查找(Binary Search)算法,也叫算法。二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。二分查找法的运行时间为对数时间O(㏒₂n),即查找到需要的目标位置最多只需要㏒₂n步,假设从[0,99]的队列(100个数,即n=100)中寻到目标数30,则需要查找步数为㏒₂100,即最多需要查找7次(2^6...

2022-08-04 15:19:44 570

原创 Spring 基于注解的自动装配

和 XML 配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测 到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作。本质上:所有一切的操作都是Java代码来完成的,XML和注解只是告诉框架中的Java代码如何执行。Spring 为了知道程序员在哪些地方标记了什么注解,就需要通过扫描的方式,来进行检测。然后根据注 解进行后续操作。@Component:将类标识为普通组件@Controller:将类标识为控制层组件。......

2022-08-04 14:47:44 623

原创 Spring 基于xml的自动装配

Xml自动装配:根据指定的策略,在IOC容器中匹配某一个bean,自动为指定的bean中所依赖的类类型或接口类 型属性赋值

2022-08-04 14:24:28 257

手写模拟器v2.0.zip

模仿手写字迹,代替抄写

2022-09-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除