java面经学习-2

锁机制

synchronized是悲观锁(排他锁),这种线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁。
CAS操作的就是乐观锁,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。

synchronized是java提供的原子性内置锁,也叫监视器锁,使用它之后,会在编译之后的同步代码块前后叫上monitorenter和monitorexit字节码指令,执行minitorenter指令时会尝试获取对象所,如果对象没有被锁定或者已经获取了锁,就会将计数器加1.此时其他竞争线程就会进入等待队列,长记性monitorexit指令使会将计数器j减1,如果计数器为0,就释放锁,处于等待队列的线程继续竞争锁。

锁优化

锁的状态从低到高分别是无锁-偏向锁-轻量级锁-重量级锁。
自旋锁:大部分情况下,锁被占用的时间很短,共享变量锁定的时间也很短,而线程在用户态和内核态的来回上下文切换很影响性能,所以没必要将锁挂起。自旋的概念就是让线程执行一个忙循环,可以理解为啥也不干,就是防止线程从用户态切换到内核态。自旋的默认次数使10.
自适应锁:自适应的自旋锁,自旋的时间由前一次在同一个锁上的自旋时间决定。
锁粗化:指有很多个操作对同一个对象进行加锁,就会吧锁的同步范围扩大到整个操作序列之外。
偏向锁:当同步代码块获取到锁时,会在对象头和栈桢中的锁记录里存储偏向锁的线程id,之后这个线程再次进入同步块时都不需要CAS来进行加锁和解锁了,偏向锁永远偏向第一个获得锁的线程。当有其他线程竞争偏向锁时,持有偏向锁的线程就会释放偏向锁。
轻量级锁:JVM的对象的对象头中包含了一些锁的标志位,代码进入同步块时,JVM会通过CAS方式获取锁,如果更新成功就会把对象头中的状态为标记为轻量级锁,如果更新失败,当前线程就尝试自旋来获取锁。
重量级锁:除拥有锁的其他线程全部堵塞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值