1 锁偏向。当现成请求一个对象锁时,如果获得锁,则该对象锁进入偏向模式,当该线程再次请求该对象的锁时,无需再做任何同步操作。
可通过在Java虚拟机中开启参数-XX:+UseBasedLock开启偏向锁
适用环境是:锁的竞争不是很激烈。如果是锁竞争非常激烈的环境下,很可能下次请求当前锁的不是同一个线程,此时偏向锁失效
2 轻量锁 。如果偏向失败,虚拟机并不会立即挂起线程。虚拟机会简单的将对象的头部作为指针,指向持有锁的线程的堆栈内部,以此来判断一个线程是否持有对象锁。
如果线程获得轻量级锁成功,则可以顺利进入线程内部。
3 自旋锁。如果轻量级锁失败,线程不会立即被挂起,虚拟机还会做最后的努力:自旋锁。由于其他线程已经获得锁,我们不知道该锁什么时候会被释放,如果简单粗暴的直接将当前线程挂起,可能会得不偿失,徒增资源消耗。这时候虚拟机会假设在不久的将来,我们可以获得锁。系统会让当前线程做几个空循环,在进行几个循环之后,如果获得锁,就进入临界区,否则挂起线程。
4 锁消除。虚拟机在JIT编译时,进行上下文扫描,去除不可能存在资源竞争的锁
相关文章
- 07-30Java面试-锁的内存语义,java基础入门第二版电子书
- 07-30从 Synchronized 到锁的优化
- 07-30Java中的读写锁
- 07-30java中for循环中为了去掉最后一个字符的优化
- 07-30ART虚拟机 _ Java对象和类的内存结构,java中级面试题库weixin
- 07-30【多线程性能调优】多线程之锁优化(上):Synchronized同步锁的优化方法
- 07-30重量级锁synchronized的优化----自旋锁、自适应自旋锁、锁消除、锁粗化
- 07-30【java虚拟机序列】java中的垃圾回收与内存分配策略
- 07-30Java虚拟机线上问题排查的2个基本操作,你知不知道?
- 07-30你觉得我的这段Java代码还有优化的空间吗?