JAVA锁优化和一些基本锁的概念

1. 乐观锁和悲观锁

乐观锁:这里的锁并不是指锁本身,而是一种设计思想。乐观锁的思想就是对于并发采取乐观的态度,先对数据进行操作,如果没有其它线程争用共享数据,那么就认为这个操作成功了;如果有冲突,那就采取其它补偿措施,如不断重试等。一般来说,非阻塞同步方式(volatile,原子类)都是乐观锁。
悲观锁:该锁思想为只要不做正确的同步措施,那就肯定出现问题,无论数据是否竞争,都需要加锁。阻塞同步方式(syn,lock)都是悲观锁。

2. 自旋锁与自适应自旋

自旋锁:在syn关键字和lock锁的底层实现中,当一个线程想要去拿到另外一个线程锁占用的锁时,该线程会进入等待状态,等到持有该锁的线程将锁释放时会将等待的线程唤醒。在这个等待和唤醒的过程中涉及到线程的调度,需要内核态到用户态的转换,会产生大量的时间消耗。于是虚拟机开发团队为了解决这个问题,选择在一个线程无法得到另外一个线程的锁时让这个线程进入一个忙循环(自旋)中,而不是进入等待状态,避免了线程切换的开销。但是却会增加处理器的负担,当等待时间比较短时,自旋锁会提高效率,当等待时间较长时,自旋锁反而会降低效率,可通过参数-XX:PreBlockSpin更改自选等待次数。自旋锁在1.6版本后默认开启。
自适应自旋:自适应自旋的自旋等待时间是可变的,主要取决于前一次在同一个锁的自旋时间以及拥有者的状态来决定。如果一个锁上一次的自旋时间很短,那么就认为这一次成功几率会很大,会允许等待更长时间;如果一个锁很少被成功获得,则系统会认为没有必要自旋等待该锁。

3. 锁消除

虚拟机即时编译器在运行时,对一些在代码上要求同步,但是被检测到逻辑上不可能存在共享数据竞争的锁进行消除。判定是否存在数据竞争的基本原理为逃逸分析。

4. 锁粗化

在代码中存在对同一个对象进行反复加锁与解锁时,虚拟机会将加锁同步操作加到这一系列操作之外形成一个锁以减少资源消耗。

5. 轻量级锁与偏向锁

之所以将轻量级锁与偏向锁放在一起总结,是他们的基本原理类似且具有许多可以比较的特点。
轻量级锁原理:简单来说,就是对象头Markword有一个标志位来决定这个对象的加锁状态,在轻量级锁中,对象加锁就是利用CAS操作将Markword更新为指向栈中锁对象(Lock Record)的指针,该操作成功,则加锁成功;若失败,则先检查当前线程是否已经拥有指向这个对象的锁,如果拥有则直接执行,如果未拥有,则出现线程抢占,需要膨胀为重量级锁。
偏向锁原理:加锁方式基本与轻量级所相似,只不过标志位不同。但是偏向锁只进行一次CAS操作,此后持有偏向锁的线程每一次进入该同步块都无需进行同步操作。
三者的区别与转化关系:
等等
区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值