目录
前言
多线程基本面试题,
一、synchronized底层关键字
1.synchronized对象锁采用互斥方式让同一时刻至多有一个线程能持有对象锁
2.底层使用monitor实现,是jvm级别的对象,使用c++实现,线程想要获取锁需要使用对象关联monitor
3.monitor有三个属性分别是owner,entrylist,waitset
owner:当前获取锁的对象,至多只有一个线程可以获取
entrylist:没有抢到锁的线程,处于blocked(阻塞)状态
waitset:调用了wait方法的线程,处于waiting状态
二、对象是如何关联mintor的?
对象头mark word中存储指向monitor的指针
三、monitor锁是重量级的锁,你了解过锁的升级码?
java中sychronized有重量级、轻量级、偏向级锁,分别对应多线程竞争、不同线程交替、一个线程持有,是在jdk1.6后引入的轻量级跟偏向级
重量级:底层monitor实现,涉及用户态和内核态切换,进程上下文切换,成本高性能低
轻量级:线程加锁的时间错开,无竞争,使用轻量级锁,修改对象头部标志,每次修改都进行CAS操作,保证原子性
偏向锁:很长时间内锁被一个线程使用,第一次获得锁的时候进行CAS操作,之后再获取只需判断mark work是否含有自己线程的id,而不是开销相对大的CAS
四、说明一下JMM(Java内存模型)
1.JMM定义了共享内存中多线程线程读写操作,行为规范,保证指令的正确性
2.JMM把内存分两块,一块私有线程工作区域(工作内存),一块有所线程共享区域(主内存)
3.线程间相互隔离,交互通过主内存
五、CAS操作
1.CAS是一种乐观锁,在无锁的状态下保证线程操作原子性
2.CAS使用在AQS框架,AtomicXXX类等
3.CAS操作共享变量使用自旋锁,效率更高
4.底层使用Usafe类中的方法,都是操作系统提供,其他语言实现
六、乐观锁和悲观锁的区别
1.CAS是基于乐观锁的实现,不怕别的线程修改共享变量,大不了自旋等待,适合多读操作的场景
2.synchronized是基于乐观锁的实现,防止其他线程来修改共享变量,最悲观的估计,适合多写操作的场景
总结
每天面试题