JAVA:简单易懂了解锁升级

JAVA:简单易懂了解锁升级

为什么有锁升级:性能优化的智慧

锁升级的核心目标是在保证线程安全的前提下,最大限度地减少锁带来的性能开销

举个栗子:

用一个简单易懂的“办公室会议室”比喻,给你讲清楚Java的锁升级。

首先明确一点:锁升级是JVM为了优化 synchronized关键字性能而设计的内部机制。它的核心思想是:大多数情况下,锁不仅不存在竞争,而且总是由同一个线程多次获得。​ 因此,没必要一开始就用“大炮”(重量级锁),而是从“小装备”开始,根据需要逐步升级。

整个过程分为4个状态,我们想象一个“锁对象”(比如一个会议室)的生命周期:


第一步:无锁状态

  • 场景:会议室(锁对象)刚建好,还没人用。任何线程(员工)都可以直接进去使用。
  • 对应:一个新创建的对象,还没被任何线程加锁。

第二步:偏向锁 (单线程多次访问)

  • 核心思想这个锁“偏爱”第一个来用它的人。​ 假设员工A第一个使用了会议室。
  • JVM操作:JVM会在这个会议室门口贴一张“常驻牌”,上面写着“A专属”。同时,在对象头里记录A的线程ID。
  • 后续
    • 如果A下次又来用会议室,一看牌子是自己的,直接进去,没有任何额外检查,开销极低。
    • 如果员工B也想用,会发现牌子是A的(发生了竞争)。JVM会先暂停A,检查A是否还在用会议室。
      • 如果A已经用完了(同步代码块已退出),JVM就把牌子撕掉,然后重新贴成B的(偏向锁撤销并重偏向)。
      • 如果A还在用,说明有竞争,偏向锁就需要升级
  • 目的:消除同一线程重入锁的开销。适用于只有一个线程反复进入同步块的场景。

第三步:轻量级锁 / 自旋锁 (少量线程短时间竞争)

  • 场景:当偏向锁因为竞争(B也想用)而升级后,就进入这个状态。
  • 比喻:现在会议室没有“常驻牌”了。A在里面开会,B来了。B不会去“领导办公室”(操作系统内核)那里投诉,而是选择在门口等一会儿自旋),边等边嘀咕:“A应该快出来了吧?我再等等看……”
  • JVM操作
    1. JVM会在当前线程的栈帧中创建一个“锁记录空间”,并拷贝会议室门上的标记。
    2. 然后尝试用CAS操作(一种乐观的原子操作)把会议室门牌换成指向自己“锁记录”的指针。如果成功,就拿到锁。
    3. 竞争线程(B)通过自旋(循环尝试CAS)来尝试获取锁。
  • 优点:避免了直接惊动操作系统内核(重量级操作),在竞争不激烈、等待时间极短的情况下效率很高。
  • 缺点:如果B在门口等得太久(自旋超过一定次数或自旋线程数增加),就会白占着CPU资源,属于“空转”,得不偿失。

第四步:重量级锁 (真正激烈的多线程竞争)

  • 场景:如果B在门口自旋等了很久(比如自旋了10次),A还没出来,或者又有C、D、E…一群员工都在门口自旋等着。
  • JVM操作:这时候,JVM就会判定竞争太激烈了。它会将轻量级锁升级为重量级锁
  • 比喻
    1. B不再在门口傻等,而是去“领导办公室”(操作系统内核)正式登记排队。
    2. 操作系统会把B放到一个等待队列里,并挂起B的线程(让B去休息,不占用CPU)。
    3. 当A用完会议室出来时,会去“领导办公室”报告。操作系统会从等待队列里叫醒一个(比如B),让它去用会议室。
  • 特点
    • 开销大:涉及到操作系统内核的线程调度、状态切换(用户态 -> 内核态)。
    • 不占用CPU:没拿到锁的线程会被挂起,不消耗CPU周期。
    • 适合场景高并发、长耗时的同步场景。

流程图

核心要点:

  1. 升级是单向的: 从无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁。降级理论上会发生但条件苛刻,可以忽略。
  2. 目的: 在没有竞争或竞争不激烈的情况下,用最小的开销实现同步。
  3. 自动化: 整个过程由JVM自动完成,程序员只需正确地使用 synchronized

简单记忆

  • 偏向锁: “这是我专用。”(适合单线程)
  • 轻量级锁: “我在门口等会儿。”(适合短时间、低竞争)
  • 重量级锁: “我去领导那排队。”(适合高并发、长耗时)

Read more

C++ 方向 Web 自动化测试入门指南:从概念到 Selenium 实战

C++ 方向 Web 自动化测试入门指南:从概念到 Selenium 实战

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 自动化测试基础:先搞懂"为什么"和"做什么" * 1.1 自动化测试的核心目标:回归测试 * 1.2 自动化测试分类:别把 “不同自动化” 混为一谈 * 1.3 自动化测试金字塔:如何分配测试资源? * 二. Web 自动化测试核心:环境搭建与驱动管理 * 2.1 核心组件原理:三者如何协同工作? * 2.2 环境搭建:3 步搞定依赖安装

By Ne0inhk
一位过来人的 Web 前端开发全维准备指南

一位过来人的 Web 前端开发全维准备指南

真正拉开开发者差距的,不是敲下第一行代码的速度,而是动笔之前思维框架的深度。 在这个数字化渗透进每个角落的时代,Web 前端开发早已不是当年那个“切图仔”的简单活儿。它是连接用户与数字世界的桥梁,是产品体验的灵魂载体,更是一门融合了艺术感性与工程理性的复杂学科。当无数零基础的学习者怀揣着改变职业轨迹的梦想,准备敲下人生第一个 <html> 标签时,我想邀请你们稍作停留。 本文不急于教你如何写代码,而是希望与你深入探讨:在真正踏上这条充满魅力与挑战的道路之前,我们需要在思维、心态、知识和工具上做哪些准备,才能让这段旅程走得更稳、更远、更具成长性。 一、思维重构:像工程师一样思考 学习前端的第一步,不是下载编辑器,而是启动大脑的“编程思维”模式。这是一种将现实世界的复杂问题,转化为计算机能够理解和执行的逻辑化、结构化思考方式。 抽象能力:从具象到通用 当你面对一个精美的网页时,编程思维会让你下意识地拆解它:这个导航栏可以抽象成一个包含 Logo 和菜单项的组件;这个商品卡片,可以提炼为一个可复用的模板,由图片、标题、价格三个数据槽位构成。

By Ne0inhk
Flutter 三方库 tflite_web 端云协同 AI 引擎鸿蒙化高配适配:搭建异构计算 WebGL 后台管线并强力驱动 TensorFlow Lite-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 tflite_web 端云协同 AI 引擎鸿蒙化高配适配:搭建异构计算 WebGL 后台管线并强力驱动 TensorFlow Lite-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 tflite_web 端云协同 AI 引擎鸿蒙化高配适配:搭建异构计算 WebGL 后台管线并强力驱动 TensorFlow Lite 轻量大模型推理内核运转 前言 在 OpenHarmony 构建混合架构(Hybrid App)的过程中,将 AI 能力直接下沉到客户端侧执行已成为主流趋势。虽然鸿蒙原生提供了强大的 AI 框架,但对于已有大量积累、且运行在 Flutter Web 容器中的应用而言,寻找一致性的端侧 AI 推理方案至关重要。tflite_web 库为基于 Flutter Web 的应用提供了调用 TensorFlow Lite 模型的能力。本文将调研其在鸿蒙 Web

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 flutter_cors 应对鸿蒙 Web 与混合开发中的跨域挑战(网络兼容方案)

Flutter for OpenHarmony: Flutter 三方库 flutter_cors 应对鸿蒙 Web 与混合开发中的跨域挑战(网络兼容方案)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 的跨平台开发时,我们不仅开发原生 HAP,有时也会涉及 Flutter Web 或是在鸿蒙端侧运行 Webview 混合应用。这时,一个经典的“拦路虎”就会出现:CORS (跨源资源共享) 限制。当你的 Web 端尝试访问一个未配置跨域头部的后端 API 时,请求会被浏览器拦截,报错信息极其晦涩。 虽然 CORS 主要是后端的工作,但 flutter_cors 提供了一种客户端视角的辅助工具。它通过工具化手段帮助开发者分析、绕过或生成跨域适配规则,是保证鸿蒙跨平台 Web 项目顺利运行的调试利器。 一、跨域访问逻辑模型 CORS 是一种浏览器的安全保护机制,它在请求发出前先进行“预检(Preflight)

By Ne0inhk