a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 115|回复: 0

[其他] JAVA技巧:Java多线程优化之偏向锁原理

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
Java倾向锁(Biased Locking)是Java 6惹人的一项多线程优化。它经由过程消弭资本无竞争情形下的同步原语,进一步提高了轨范的运行机能。   轻量级锁也是一种多线程优化,它与倾向锁的区别在于,轻量级锁是经由过程CAS来避免进入开销较年夜的互斥操作,而倾向锁是在无竞争场景下完全消弭同步,连CAS也不执行(CAS自己模拟仍是是一种操作系统同步原语,始终要在JVM与OS之间往返,有必然的开销)。
# m3 B8 d$ R9 `  所谓的无竞争场景,举个例子,就是单线程访谒带同步的资本或体例。
/ K2 a8 A/ q8 O! {, p3 F8 _倾向锁实现事理 ' Y% R* M9 K2 ?8 v
  倾向锁,顾名思义,它会倾向于第一个访谒锁的线程,如不美观在接下来的运行过程中,该锁没有被其他的线程访谒,则持有倾向锁的线程将永远不需要触发同步。% O5 I& I9 E" z! T7 T$ r
  如不美观在运行过程中,碰着了其他线程抢占锁,则持有倾向锁的线程会被挂起,JVM会考试考试消弭它身上的倾向锁,将锁恢复到尺度的轻量级锁。(倾向锁只能在单线程下起浸染)$ Q& `7 E& E6 _5 C; W  V" s
  经由过程下图可以更直不美观的理解倾向锁:    % o' Z8 a, K2 X7 D+ c% Z4 H
  这张图,省略了轻量级锁相关的几处轨范,将关注点更多地聚焦在倾向锁的状况转变上。& D4 ^, p) ]9 x  m2 ^
  倾向模式和非倾向模式,不才面的mark word表中,首要表此刻thread ID字段是否为空。    . c( N$ V2 ]) \( [1 j
  挂起持有倾向锁的线程,这步操作近似GC的pause,但分歧之处是,它只挂起持有倾向锁的线程(非当前方程)。
; s7 Z9 O4 a, [8 S& I# @  在抢占模式的橙色区域声名中有提到,指向当前仓库中比来的一个lock record(在轻量级锁事理一文有讲到,lock record是进入锁前会在stack上建树的一份内存空间)。& Y/ U- f; [) R$ x) {+ H
  这里提到的比来的一个lock record,其实就是当前锁地址的stack frame上分配的lock record。: s4 R& E8 A, `' j8 L
  整个轨范是细腻向锁恢复到轻量级锁的过程。
1 W) s% U) |9 |' D  倾向锁也会带来额外开销: k. Q" {: g) D0 e- a5 l9 V3 D
  在JDK6中,倾向锁是默认启用的。它提高了单线程访谒同步资本的机能。
1 R+ K; F" K: A1 E  但试想一下,如不美观你的同步资本或代码一向都是多线程访谒的,那么消弭倾向锁这一轨范对你来说就是多余的。事实上,消弭倾向锁的开销仍是蛮年夜的。
7 ]- U" o9 s8 N- a. a  所以在你很是熟悉自己的代码前提下,年夜可禁用倾向锁 -XX:-UseBiasedLocking 。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-22 09:08 , Processed in 0.273448 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表