所谓的偏向,就是偏心,即锁会偏向于当前已经占有锁的线程 。

大部分情况是没有竞争的(某个同步块大多数情况都不会出现多线程同时竞争锁),所以可以通过偏向来提高性能。即在无竞争时,之前获得锁的线程再次获得锁时,会判断是否偏向锁指向我,那么该线程将不用再次获得锁,直接就可以进入同步块。

偏向锁的实施就是将对象头Mark的标记设置为偏向,并将线程ID写入对象头Mark

当其他线程请求相同的锁时,偏向模式结束

JVM默认启用偏向锁 -XX:+UseBiasedLocking

在竞争激烈的场合,偏向锁会增加系统负担(每次都要加一次是否偏向的判断)

代码例子

public class TestUseBisaedUsing {public static List<Integer> numberList = new Vector<Integer>();public static void main(String[] args) throws InterruptedException {long begin = System.currentTimeMillis();int count = 0;int startnum = 0;while (count < 10000000) {numberList.add(startnum);startnum += 2;count++;}long end = System.currentTimeMillis();System.out.println(end - begin);}

Vector是一个线程安全的类,内部使用了锁机制。每次add都会进行锁请求。上述代码只有main一个线程再反复add请求锁。

使用如下的JVM参数来设置偏向锁:

-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0

BiasedLockingStartupDelay表示系统启动几秒钟后启用偏向锁。默认为4秒,原因在于,系统刚启动时,一般数据竞争是比较激烈的,此时启用偏向锁会降低性能。

由于这里为了测试偏向锁的性能,所以把延迟偏向锁的时间设置为0。

可以看到运行时间为423ms

下面关闭偏向锁:

-XX:-UseBiasedLocking

输出699ms

一般在无竞争时,启用偏向锁性能会提高5%左右。

面试题-- 什么是偏向锁相关推荐

  1. 偏向锁-批量重偏向和批量撤销测试

    前言 最近看了一些synchronized底层原理的博文,对偏向锁这块儿不是很理解,结合网上一些博主的文章和示例代码,记录下自己的理解. 参考的文章有: 1.程序员囧辉的全网最硬核的 synchron ...

  2. Java面试题之:乐观锁、悲观锁与自旋锁及其相关锁的优化(万字知识点详解)

    Java面试题之:乐观锁.悲观锁与自旋锁及其锁的优化 一.乐观锁 二.悲观锁 三.自旋锁 ①自旋锁的优缺点 ②自旋锁时间阈值(1.6 引入了适应性自旋锁) ③自旋锁的开启 四.Synchronized ...

  3. 最强 JDK15 安装与讲解,有点想升级,终于要废弃偏向锁了!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:my.oschina.net/waylau/blog ...

  4. 简单理解重量级锁、轻量级锁、偏向锁

    全文使用synchronized来说明. synchronized给对象上锁,先上偏向锁,在上轻量级锁,最后上重量级锁.上什么锁,是gvm根据竞争程度自行变换的. 重量级锁 计算机操作系统本有Moni ...

  5. 线程安全(中)--彻底搞懂synchronized(从偏向锁到重量级锁)

    接触过线程安全的同学想必都使用过synchronized这个关键字,在java同步代码快中,synchronized的使用方式无非有两个: 通过对一个对象进行加锁来实现同步,如下面代码. synchr ...

  6. 难搞的偏向锁终于要被Java移除了

    [文章来源][公众号:日拱一兵] 背 景 在 JDK1.5 之前,面对 Java 并发问题, synchronized 是一招鲜的解决方案: 普通同步方法,锁上当前实例对象 静态同步方法,锁上当前类 ...

  7. jvm第7节-锁(偏向锁,轻量锁,自旋锁)

    为什么80%的码农都做不了架构师?>>>    在介绍锁之前我们先介绍一个线程不安全的例子,一个全局的list,开2个线程往里面插入数据,代码如下: package com.jvm. ...

  8. java多线程之锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁

    转载至:https://blog.csdn.net/zqz_zqz/article/details/70233767 之前做过一个测试,详情见这篇文章<多线程 +1操作的几种实现方式,及效率对比 ...

  9. JAVA偏向锁的什么时候释放_Java中的偏向锁

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Java偏向锁(Biased Locking)是Java6引入的一项多线程优化. 偏向锁,顾名思义,它会偏向于第一个访问锁的线程,如果在运行过程中,同步锁 ...

最新文章

  1. 统计学Java_【gloomyfish】基于Java的统计学计算结果
  2. (附下载地址)制作RPM包(星际译王词典包)
  3. 采用全文索引解决模糊查询速度慢的问题
  4. 数据服务器 操作系统,服务器如何选择操作系统
  5. linux shell后台运行
  6. Python爬虫应用实战-爬取股票数据做分析
  7. set python_python基础:集合-set()
  8. Veritas Backup Exec 10简体中文版+winXP SP2安装问题
  9. vp翻N_VP刀叨叨:如何让G胖给你唱生日歌
  10. Apache RewriteCond on HTTP_COOKIE
  11. html不使用cache数据
  12. C++连接MYSQL教程
  13. java常用的库_java有哪些常用的库
  14. Jmeter测试计划无法保存或者另存为
  15. Drupal 主题函数知识
  16. 解决Oracle使用in语句不能超过1000问题
  17. flash debug版本
  18. 台式计算机蓝牙完成配对,电脑蓝牙已配对但连不上 带你快速解决一下
  19. TestFlight iOS 平台 App内测 工具使用
  20. mysql5.7.76安装,MySQL 5.7.30 的安装/升级(所有可能的坑都在这里)

热门文章

  1. nagios 监控配置介绍(二)
  2. 【网络基础】《TCP/IP详解》学习笔记3
  3. 创建基于AJAX技术的Scribble应用程序
  4. vxWorks下常用的几种延时方法
  5. 开源视觉salm算法介绍
  6. android另类工具,[置顶] android应用程序开发另解及Android SDK工具集的另类用法
  7. 二阶振荡衰减 matlab,基于Matlab/Simulink的二阶控制系统仿真研究
  8. java缓存技术_java缓存技术
  9. ios跨线程通知_iOS多线程开发(三)---Run Loop(一)
  10. directoryinfo 读取 映射磁盘_LoaRunner性能测试系统学习教程:磁盘监控(5)