我是胡说八道君,鉴别一个人基础打得牢不牢,有没有这个举一反三、将学过的知识串联起来的能力,教你一个简单的方法:关键词联想法
有兴趣的童鞋也可以跟着我的思路去画一张思维导图哦!加入你自己联想道德的部分更重要
eg: 给你一个synchronized关键字,你能想到什么?
初学Java的:我知道,一个关键字嘛,一个同步锁,保证多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。一般都是用在实例方法、静态方法、代码块这些地方。字节码monitorenter moniterexit,ACCESS_SYNCHONIZED
提到锁你是不是能想到死锁?提到死锁,死锁的四个条件是什么?怎么检测死锁?怎么避免死锁?怎么处理死锁?
从初学者这里除了多线程、同步锁、线程安全、deadlock、同步方法等你还get到哪些?
急于找工作的同学:我知道,sync是悲观锁,悲观锁就是保险箱,每次看完就要上锁,生怕钱丢了,再介绍下乐观锁是什么?
再聊一下sync的锁升级过程,锁升级过程又涉及到无锁、偏向锁、自旋锁、重量级锁,说到这些是不是能想到CAS,CAS又能想到ABA、版本号。都聊到CAS了,那能不谈谈Unsafe嘛
这个图有了解的吗?
说完这些,懂哥出来了:我知道,他说的很对,但是不全,锁升级是由Java对象头中的markword中的锁状态控制的,哇哇哇哇介绍一下对象头有哪些东西,聊一下这个对象头每次升级会有什么变化?原理是什么?
底层是有一个Monitor的监视器对象,因为monitor对象存在于对象的对象头中,所以任意对象都能成为锁。monitor锁依赖于操作系统的Mutex lock实现,os实现线程之间的切换需要从用户态转到内核态,耗时长,1.6之后对synchronized做了优化,引入轻量级锁、偏向锁。
看完这一段,是不是能get到很多点?
再学到jvm,你会发现JMM这一节里面是不是也有相关的知识点,sync是不是保证了可见性、原子性、有序性,JMM中绕不过去的点volatile关键字,volatile是不是又能想到内存屏障这四个字,loadload、storestore、loadstore、storeload,ACC_VOLATILE是不是和前面的ACC_SYNC类似,还有什么happens-before是什么?
堆栈空间:每个线程在进入synchronized代码块时会创建一个锁记录(Lock Record)在栈帧中,用于保存锁的状态。
偏向锁:Mark Word存储的是偏向锁的线程ID
轻量级锁:Mark Word存储的是线程栈中Lock Record的指针
重量级锁:Mark Word存储的是指向堆中monitor对象的指针。
堆栈都是jvm中学到的点,他们也和sync有关联,那聊到堆栈,你可以从数据结构的方面想一下这两个数据结构都有什么特点,有哪些常见的问题?也可以从jvm的角度去想,堆里面存什么?栈里面存什么?
再回到操作系统里,synchronized的加锁和解锁操作涉及到用户态和内核态的切换,这可能会带来一些性能开销。
当一个线程尝试获取一个被其他线程持有的锁时,该线程会进入内核态,调用操作系统的内核函数来等待锁的释放。这个过程涉及了用户态到内核态的切换,也被称为上下文切换。当锁被释放后,等待的线程再次回到用户态,继续执行。
这种用户态到内核态的切换会引入一定的性能开销,因为切换过程需要保存和恢复线程的上下文信息。如果并发线程较多,频繁的用户态和内核态切换可能会影响系统的性能表现。因此,在设计并发程序时,需要考虑synchronized的使用频率和锁粒度,以减少不必要的上下文切换,从而提高性能。
因为这个原因,Java后续是不是为了提高sync的使用度,对sync进行了一个锁优化,同时也引进了一些ReentrantLock等等的类
锁粒度的概念一些人可能不了解,锁粒度是指锁的作用范围或影响范围,它决定了在何种情况下线程需要竞争锁以及锁的精细程度。锁粒度可以分为粗粒度锁和细粒度锁两种。
比如HashTable这个类,如果有两个人一个人要取1,一个人要取2,no不可以,每次的操作是锁表整个hash表,这个锁是不是粒度就很大,一次锁整张表。别人想用只能等。
既然发现这样的问题了,是不是该解决,于是ConcurrentHashMap是不是就出现了,这个1.7版本是不是用了sync关键字,而且它使用了分段锁segment,下面这个图是不是很直观,当然它可能不是这样锁的,具体的你们下去再查查,这样一看是不是对这个锁的粒度来感觉了。
那感觉很不错啊,那为什么1.8又改了ConcurrentHashMap呢,1.8将sync替换成了CAS好像,在原来的数组+链表的形式,引入了红黑树,那他的锁粒度好像优化到了红黑树的根结点还是具体的节点,这个太久了记不清了,反正这个锁的粒度肯定是比1.7更小。
那关于锁的粒度你还能想到什么?
MySQL是不是有很多锁呢?
我们学习的时候可以去当个串子,把你能想到的都串起来,这样就不至于面试被问到一个知识点,你只能叭叭两句就完了。
随笔,瞎扯蛋,如果你学到了,可以填写一下腾讯收集文档,如果觉得我是瞎扯,那你猜对了, 我确实在瞎扯。
happy ending,希望你们昨天七夕过的快乐
有木有人知道,如果我是这篇文章的原创作者,那么我在csdn上第二次发布需要点转载吗?