多线程常见面试题(二)

本文详细解析了Java中synchronized的关键字、monitor锁的工作原理,包括其重量级和轻量级的不同,以及JMM对内存模型的规范。同时介绍了CAS操作和乐观锁与悲观锁的区别,为多线程编程提供深入了解。
摘要由CSDN通过智能技术生成


前言

  多线程基本面试题,


一、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是基于乐观锁的实现,防止其他线程来修改共享变量,最悲观的估计,适合多写操作的场景


总结

  每天面试题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

载着梦想的猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值