多线程学习(二)-锁

前言

——学习材料:java并发编程的艺术
上篇文章,就提到了synchronized和ReetrantLock等等,这篇文章就来较为详细的说说锁.
* 在javaSE 1.6中,锁一共有4种状态,级别从低到高依次是:无锁状态,偏向锁状态,轻量级锁状态,重量级状态.锁可以升级不可以降级
* 锁的状态保存在对象的头文件中,32位JVM的MarkWord默认存储结构如下图
这里写图片描述

偏向锁

  • 偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁没有被其他线程获取,持有偏向锁的线程将永远不需要同步.
  • 获取锁过程:
    • 访问MarkWord偏向锁的标识是否设置为1,锁标志物是否为01,确认为可偏向状态
    • 若为可偏向状态,检查对象头中是否存储了当前线程,若是, 执行同步代码, 否则,进入下一步
    • 通过cas竞争锁,若竞争成功 ,则将MarkWord中的线程ID指向自己.然后同步代码,否则,进入下一步
    • 若cas竞争失败,表示有竞争,当到达

猜你喜欢

转载自blog.csdn.net/kwy15732621629/article/details/80786404