掘友等级
获得徽章 0
#每天一个知识点#
锁的升级流程
每⼀个线程在准备获取共享资源时: 第⼀步,检查MarkWord⾥⾯是不是放的⾃⼰
的ThreadId ,如果是,表示当前线程是处于 “偏向锁” 。
第⼆步,如果MarkWord不是⾃⼰的ThreadId,锁升级,这时候,⽤CAS来执⾏切
换,新的线程根据MarkWord⾥⾯现有的ThreadId,通知之前线程暂停,之前线程
将Markword的内容置为空。
第三步,两个线程都把锁对象的HashCode复制到⾃⼰新建的⽤于存储锁的记录空
间,接着开始通过CAS操作, 把锁对象的MarKword的内容修改为⾃⼰新建的记录
空间的地址的⽅式竞争MarkWord。
第四步,第三步中成功执⾏CAS的获得资源,失败的则进⼊⾃旋 。
第五步,⾃旋的线程在⾃旋过程中,成功获得资源(即之前获的资源的线程执⾏完
成并释放了共享资源),则整个状态依然处于 轻量级锁的状态,如果⾃旋失败 。
第六步,进⼊重量级锁的状态,这个时候,⾃旋的线程进⾏阻塞,等待之前线程执
⾏完成并唤醒⾃⼰
#每天一个知识点#
偏向锁会偏向于第⼀个访问锁的线程,如果在接下来的运⾏过程中,该锁没有被其
他的线程访问,则持有偏向锁的线程将永远不需要触发同步。也就是说,偏向锁在
资源⽆竞争情况下消除了同步语句,连CAS操作都不做了,提⾼了程序的运⾏性
能。
#每天一个知识点# Redis(Remote Dictionary Server)是一种开源的内存数据库管理系统,它提供了高性能的键值存储和缓存解决方案。Redis以内存作为主要的数据存储介质,通过将数据存储在内存中,实现了快速的读写访问。它支持多种数据类型(如字符串、哈希、列表、集合、有序集合等),并提供了丰富的操作命令和功能。
#每天一个知识点# 在JavaScript中捕获和处理异常,以及如何使用try-catch语句来处理可能出现的错误。详细回答:在JavaScript中,可能会出现各种异常,如未定义的变量、空指针引用等。通过使用try-catch语句,我们可以捕获这些异常,并在出现错误时执行相应的逻辑,以避免程序崩溃或产生不可预期的结果
#每天一个知识点#
计算机在执⾏程序时,为了提⾼性能,编译器和处理器常常会对指令做重排。
为什么指令重排序可以提⾼性能?
简单地说,每⼀个指令都会包含多个步骤,每个步骤可能使⽤不同的硬件。因此,
流⽔线技术产⽣了,它的原理是指令1还没有执⾏完,就可以开始执⾏指令2,⽽不
⽤等到指令1执⾏结束之后再执⾏指令2,这样就⼤⼤提⾼了效率。
但是,流⽔线技术最害怕中断,恢复中断的代价是⽐较⼤的,所以我们要想尽办法
不让流⽔线中断。指令重排就是减少中断的⼀种技术。
#每天一个知识点#
object-fit: none; 用于设置元素中的内容在容器中的显示方式。表示内容不会被裁剪或缩放,它将按照原始尺寸完全展示,可能会超出容器的边界。
#每天一个知识点#
InheritableThreadLocal类与ThreadLocal类稍有不同,Inheritable是继承的意思。
它不仅仅是当前线程可以存取副本值,⽽且它的⼦线程也可以存取这个副本值。
#每天一个知识点#
ThreadLocal是⼀个本地线程副本变量⼯具类。
ThreadLocal为线程本地变量或线程本地存储。严格来说,ThreadLocal
类并不属于多线程间的通信,⽽是让每个线程有⾃⼰”独⽴“的变量,线程之间互不
影响。它为每个线程都创建⼀个副本,每个线程可以访问⾃⼰内部的副本变量
#每天一个知识点#
在我们的线程之间,有⼀个同步的概念。什么是同步呢,假如我们现在有2位正在
抄暑假作业答案的同学:线程A和线程B。当他们正在抄的时候,⽼师突然来修改
了⼀些答案,可能A和B最后写出的暑假作业就不⼀样。我们为了A,B能写出2本相
同的暑假作业,我们就需要让⽼师先修改答案,然后A,B同学再抄。或者A,B同
学先抄完,⽼师再修改答案。这就是线程A,线程B的线程同步。
可以以解释为:线程同步是线程之间按照⼀定的顺序执⾏。
为了达到线程同步,我们可以使⽤锁来实现它
#每天一个知识点# 使用cookie需要考虑安全性、容易被篡改、不要存储敏感信息、尽量减少cookie的体积,使用httponly等;而使用session需要考虑内存、集群方式需要考虑session共享的问题,移动端对cookie的支持不是很好,而session需要基于cookie实现,所以移动常用的是token;使用token和jwt需要考虑失效时间,因为存储了部分用户的信息,为了安全性还可以对其二次加密等。
下一页