synchronized锁升级的过程有些不太理解

来源:5-1 用不好 Synchronized 关键字

落烨的位置

2020-12-07

一哥,轻量级锁升级为重量级锁到底是怎么升级的呢。竞争的剧烈成程度是指有很多线程涌进来然后很多都去自旋才升级的吗。(我不知道我表达是否清楚。就是升级为重量级锁是线程数为直接原因,还是说数量+自旋次数导致的呢,因为自旋毕竟浪费了cpu资源)。还有就是如果线程少了锁会从重量级再一步步退回到偏向锁吗?

写回答

1回答

张勤一

2020-12-08

同学你好:

    其实,对于技术的学习,一定不要追求的过于细致,特别是这种“看不见摸不着的”知识点。我这里简单的讲解下这个锁升级的过程,同时,我也跟你说下关于 synchronized 关键字面试会问的问题(至于怎么使用这个关键字还是比较简单的)。

    synchronized 锁升级会有这样的几个过程:

    (1)无锁状态:这个比较简单,不使用这个关键字,没有竞争的情况下就是这个状态;

    (2)自旋锁:只有一个线程在使用这把锁,那么,实际上也是没有竞争条件的,所以,JVM 优化使用自旋锁,不用来回的加锁、释放锁;

    (3)轻量级锁:这就是当系统中存在竞争时,会首先升级到这个状态,让 CPU 自旋,而不是进入到睡眠状态;

    (4)重量级锁:当系统中存在着大量的竞争条件(如何确定大量,由 JVM 去判定),会让当前没有获取到锁的线程阻塞,其他线程释放了之后再去唤醒

    那么,关于这个关键字,面试的时候可能会问什么呢?主要的也就两个问题(我觉得这才是你关注的问题吧):

    (1)synchronized 与 ReetrantLock 之间的区别是什么,其实就是问你各自的实现原理是什么?

    (2)synchronized 适用在什么场景下?


    我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!

1
2
张勤一
回复
落烨的位置
没必要的,搞懂这些东西无非就是浪费时间
2020-12-08
共2条回复

Java实操避坑指南 SpringBoot/MySQL/Redis错误详解

掌握业务开发中各种类型的坑,,Java web开发领域通用

466 学习 · 204 问题

查看课程