憋个⼤招!⾼性能mysql第四版pdf在线阅读要成为黑客需要学什么
线程是否要锁住同步资源
锁住 悲观锁
不锁住 乐观锁
锁住同步资源失败线程是否要阻塞
阻塞
mysql怎么读英语不阻塞⾃旋锁,适应性⾃旋锁
多个线程竞争同步资源的流程细节有没有区别
不锁住资源,多个线程只有⼀个能修改资源成功,其它线程会重试⽆锁
同⼀个线程执⾏同步资源时⾃动获取资源偏向锁
多个线程竞争同步资源时,没有获取资源的线程⾃旋等待锁释放 轻量级锁
多个线程竞争同步资源时,没有获取资源的线程阻塞等待唤醒 重量级锁
4.多个线程竞争锁时是否要排队
排队公平锁
先尝试插队,插队失败在排队⾮公平锁
⼀个线程的多个流程能不能获取同⼀把锁
能 可重⼊锁
不能⾮可重⼊锁
多个线程能不能共享⼀把锁
能 共享
不能排他锁
悲观锁与乐观锁
悲观锁与乐观锁时⼀种⼴义的概念,体现的是看待线程同步的不同⾓度。
悲观锁
悲观锁认为⾃⼰在使⽤数据的时候⼀定有别的线程来修改数据,在获取数据的时候会先加锁,确保数据不会被别的线程修改。 锁实
现:synchronized 接⼝Lock的实现类 适⽤场景:写操作多,先加锁可以保证写操作时数据正确。
乐观锁
乐观锁认为⾃⼰在使⽤数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。 锁实现:CAS算法,例如AtomicInteger类的原⼦⾃增时通过CAS⾃旋实现。 适⽤场景:读操作较多,不加锁的特点能够使其读操作的性能⼤幅度提升。 乐观锁的执⾏流程: 线程A获取到数据以后直接操作,操作完数据以后准备更新同步资源,更新之前会先判断内存中同步资源是否被更新: 1.如果没有被更新,更新内存中同步资源的值。 2.如果同步资源被其他线程更新,根据实现⽅法执⾏不同的操做(报错or重试)。
CAS算法翻译 prototypes
全名:Compare And Swap(⽐较并交换) ⽆锁算法:基于硬件原语实现,在不使⽤锁(没有线程被阻塞)的情况下实现多线程之间的变量同步。 jdk中的实现:urrent包中的原⼦类就是通过CAS来实现了乐观锁。 算法涉及到的三个操作数:
需要读写的内存值V
进⾏⽐较的值A
要写⼊的新值的B
CAS存在的问题
1.ABA问题 线程1准备⽤CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,⼜由C替换为A,然后线程1执⾏CAS 时发现变量的值仍然为A,所以CAS成功。但实际上这时的现场已经和最初不同了,尽管CAS成功,但可能存在潜藏的问题。 举例:⼀个⼩偷,把别⼈家的钱偷了之后⼜还了回来,还是原来的钱吗,你⽼婆出轨之后⼜回来,还是原来的⽼婆吗?ABA问题也⼀样,如果不好好解决就会带来⼤量的问题。最常见的就是资⾦问题,也就是别⼈如果挪⽤了你的钱,在你发现之前⼜还了回来。但是别⼈却已经触犯了法律。但是jdk已经解决了这个问题。 想追下源码来着,但是⼀追发现直接到c了。
2.循环时间长开销⼤
3.只能保证⼀个共享变量的原⼦操作
总结
以上是字节⼆⾯的⼀些问题,⾯完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习⼿上的⾯试⼤全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个⽉,争取早⽇上
岸
下⾯给⼤家分享下我的⾯试⼤全资料,如果你也有需要,
第⼀份是我的后端JAVA⾯试⼤全
后端JAVA⾯试⼤全
countif函数跨表统计第⼆份是MySQL+Redis学习笔记+算法+JVM+JAVA核⼼知识整理
MySQL+Redis学习笔记算法+JVM+JAVA核⼼知识整理
乱世三义黄海波版第三份是Spring全家桶资料
学习笔记算法+JVM+JAVA核⼼知识整理
第三份是Spring全家桶资料
[外链图⽚转存中…(img-aJljL5Fx-1625433982673)] MySQL+Redis学习笔记算法+JVM+JAVA核⼼知识整理
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论