概述

偏向锁是JDK 1.6提出的一种锁优化方式,起核心思想是如果程序没有竞争,则取消之前已经取得锁的线程的同步操作。也就是说,某一个锁被一个线程获取之后,便进入了偏向锁模式,当该线程再次请求这个锁时,就无需再进行相关的同步操作,从而节省了操作时间。但是如果在此期间,有其他线程申请了这个锁,则退出偏向锁模式。在JVM中可以使用-XX:+UseBiasedLocking设置启用偏向锁。

实验

看如下的代码:

package com.winwill.lock;

import java.util.List;

import java.util.Vector;

/**

*@author qifuguang

*@date 15/6/5 13:44

*/

public class TestBiasedLock {

private static List list = new Vector();

public static void main(String[] args) {

long tsStart = System.currentTimeMillis();

for (int i = 0; i < 10000000; i++) {

list.add(i);

}

System.out.println("一共耗费:" + (System.currentTimeMillis() - tsStart) + " ms");

}

}

代码中使用一个循环一直往Vector中新增元素,Vector的add操作会请求锁:

/**

* Appends the specified element to the end of this Vector.

*

*@param e element to be appended to this Vector

*@return {@code true} (as specified by {@link Collection#add})

*@since 1.2

*/

public synchronized boolean add(E e) {

modCount++;

ensureCapacityHelper(elementCount + 1);

elementData[elementCount++] = e;

return true;

}

我们使用如下的参数运行代码:

-XX:+UseBiasedLocking

-XX:BiasedLockingStartupDelay=0

-Xmx512m

-Xms512m

-XX:BiasedLockingStartupDelay=0这个参数表示虚拟机一启动就启动偏向锁模式,因为默认情况下,虚拟机启动4s之后才会启动偏向锁模式,该例运行时间较短,故做此设置。

得到如下结果:

但是,如果我们使用如下的参数运行程序:

-XX:-UseBiasedLocking

-Xmx512m

-Xms512m

得到的结果如下:

结论

偏向锁在少竞争的情况下,对系统性能有一定的帮助。

注意事项

偏向锁在竞争激烈的情况下没有太强的优化效果,因为大量的竞争会导致持有锁的线程不停地切换,锁也很难一直保持偏向模式,此时,使用偏向锁不仅不能优化程序,反而有可能降低程序性能。因为,在竞争激烈的场景下可以使用-XX:-UseBiasedLocking参数禁用偏向锁。

偏向锁java_Java偏向锁相关推荐

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

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

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

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

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

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

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

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

  5. 【Java 并发编程】线程锁机制 ( 锁的四种状态 | 无锁状态 | 偏向锁 | 轻量级锁 | 重量级锁 | 锁竞争 | 锁升级 )

    文章目录 一.悲观锁示例 ( ReentrantLock ) 二.重量级锁弊端 三.锁的四种状态 ( 无锁状态 | 偏向锁 | 轻量级锁 | 重量级锁 ) 四.锁的四种状态之间的转换 ( 无锁状态 - ...

  6. 锁优化:逃逸分析、自旋锁、锁消除、锁粗化、轻量级锁和偏向锁

    1. 逃逸分析 Escape Analysis 1.1 逃逸分为两种: 方法逃逸:当一个对象在方法中被定义后,可能作为调用参数被外部方法说引用. 线程逃逸:通过复制给类变量或者作为实例变量在其他线程中 ...

  7. Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)

    一.重量级锁 上篇文章中向大家介绍了Synchronized的用法及其实现的原理.现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的.但是监视器锁本质 ...

  8. JVM中锁优化,偏向锁、自旋锁、锁消除、锁膨胀

    本文将简单介绍HotSpot虚拟机中用到的锁优化技术. 自旋锁 互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力.而在很多 ...

  9. 多线程:无锁、偏向锁、轻量锁、重量级锁

    一:java多线程互斥,和java多线程引入偏向锁和轻量级锁的原因? --->synchronized的重量级别的锁,就是在线程运行到该代码块的时候,让程序的运行级别从用户态切换到内核态,把所有 ...

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

    在介绍锁之前我们先介绍一个线程不安全的例子,一个全局的list,开2个线程往里面插入数据,代码如下: package com.jvm.day6.lock.demo; import java.util. ...

最新文章

  1. WhatsApp用户数突破10亿 每天发送消息420亿条
  2. 深圳大学面向全球引进高精尖缺人才!
  3. H3C ER5200配置***参考
  4. Kafka Architecture
  5. 文章 图片 PHP保存,关于文章图片储存
  6. Python的oop概述
  7. go程序开发注意事项
  8. Java IO篇:什么是 Proactor 网络模型?
  9. 【ATT】Reverse Nodes in k-Group
  10. linux的find命令满屏权限不够提示
  11. 华为诺亚CV方向19篇论文入选ICCV 2019
  12. ad20生成二维码_AD20学习笔记一
  13. unity镜头边缘羽化_【JTRP】屏幕空间深度边缘光 Screen Space Depth Rimlight
  14. 如何通过NTFS for Mac 15格式化连接的移动磁盘
  15. ubuntu命令行相关命令使用心得
  16. ae效果英文版翻译对照表_AE表达式中英文对照表.doc
  17. CSDN很火的汤小洋老师全部课程总共有哪些(问号问号问号)
  18. eclipse常用的搜索快捷键
  19. 计算机开机时前按什么键,开机怎么进入bios?电脑开机按什么键进入BIOS方法大全...
  20. 你的程序需要具备“自检”能力

热门文章

  1. 管壁式换热器cad图纸_各种换热器结构原理动态图,让你大开眼界!
  2. 小米8se线刷机(卡刷机一般解决不了问题,所以不用卡刷)
  3. 富士施乐3065扫描教程_富士施乐怎么设置扫描到PC
  4. libxml2交叉编译
  5. ThinkPHP商城实战
  6. Windows8.1-KB2999226-x64安装提示 此更新不适用你的计算机
  7. SpringBoot房屋租赁系统
  8. 微信群怎么添加二狗机器人?
  9. idea:java注释模板配置
  10. 引入其他字体库 和 字体样式设置