Java偏向锁
2015-06-05 14:07
381 查看
概述
偏向锁是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<Integer> list = new Vector<Integer>(); 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参数禁用偏向锁。相关文章推荐
- Spring+Quartz实现定时任务的配置方法(插曲)
- 20150605面试汇总--jdk常用package
- eclipse tab空格设置
- Struts2学习笔记1
- 用java抓取cnproxy代理服务器地址
- 在Spring3中使用注解(@Scheduled)创建计划任务
- struts2 .do .action等后缀访问问题
- Maven的Setting.xml配置默认JDK,本地仓库,repositories
- java环境变量 maven 环境变量配置
- 06-图6. 公路村村通(30) java
- struts2入门实例
- Eclipse快捷键 10个最有用的快捷键
- 一个不错的地址:包含spring框架、其他框架 等java相关的
- J2SE使用JAVA原生代码直接调用WebService Result
- Java语言描述:分支限界法之单源最短路径问题(全网独家)
- java调用规则引擎
- 随机数 java.util.Random与java.lang.Math.Random()-Java
- java注释生成文档 乱码,java.lang.IllegalArgumentException
- eclipse项目启动后访问页面出现nojdk的错误
- Java7中Switch语句支持String