001Java锁之synchronized

Posted TBBS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了001Java锁之synchronized相关的知识,希望对你有一定的参考价值。

01、synchronized & Lock

  synchronized锁同步 软件层面依赖JVM

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

02、synchronized作用域

  方法:锁住对象实例this

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

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

03、获取 & 释放锁流程

  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)时间,但释放偏向锁会增加耗时。总体来说节约了时间。

以上是关于001Java锁之synchronized的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程Day23-JUC锁之共享锁

Java分布式:分布式锁之Redis实现

详解Java多线程锁之synchronized

Java多线程Day21-JUC锁之Condition条件

Java多线程Day21-JUC锁之Condition条件

Java并非锁之独占非公平锁理解