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 。 |