001Java锁之synchronized

时间:2024-10-10 09:04:50

01、synchronized & Lock

  synchronized锁同步 软件层面依赖JVM

  Lock锁同步 硬件层面依赖cpu指令

02、synchronized作用域

  方法:锁住对象实例this

  静态方法:锁住对象Class实例

  对象实例:锁住对应方法块

03、获取 & 释放锁流程

001Java锁之synchronized

  Ready Thread:处于此状态的线程只有1个

  Running Thread:unlock时,若Entry List为空,则从Contention List中移动线程到Entry List,并指定某线程为OnDeck状态。若此OnDeck状态线程获得锁,则进          入Owner状态;否则回到Entry List

04、自旋锁

  处于Contention List、Entry List、Wait Set中的线程都处于阻塞状态,阻塞操作由操作系统完成。线程被阻塞后,便进入内核(Linux)调度状态,这会导致系统在用户态和内核态来回切换,严重影响锁性能。

  若Owner线程能很短时间内释放锁,则争用线程可自旋等待,Owner线程释放锁后,立即得到锁(对处于onDeck状态线程不公平),避免进入阻塞状态。

05、偏向锁

  锁是可重入的。若线程已获得锁,下次再获取锁(监视对象),监视对象会偏向此线程,直接获得锁,无须再走加锁/解锁流程。节约CAS(Compare and Swap)时间,但释放偏向锁会增加耗时。总体来说节约了时间。