当前位置: 首页 > news >正文

Lighthouse(灯塔)—— Chrome 浏览器性能测试工具

1.认识 Lighthouse

  Lighthouse 是 Google 开发的一款开源性能测试工具,用于分析网页或 Web 应用的性能、可访问性、最佳实践、安全性以及 SEO 等关键指标。开发人员可以通过 Lighthouse 快速了解网页的性能瓶颈,并基于优化建议进行改进。

核心功能:

  • 对页面性能进行全面分析
  • 提供优化建议和评分
  • 支持多种测试维度,如性能、可访问性、SEO、PWA 等
  • 自动化生成测试报告


使用的谷歌浏览器版本:

2.Lighthouse 的三种模式

  Lighthouse 提供三种测试模式,每个模式适用于不同场景。以下是每种模式的说明:

模式名称说明局限性
导航模式(默认)获取页面性能分数与指标。
评估渐进式 Web 应用功能。
分析页面加载后的可访问性。
无法分析表单提交或单页应用的转换。
时间跨度模式测量特定时间范围内的性能(如布局偏移、JS 执行时间)。
适合评估长时间使用的页面或 SPA。
不提供总分。
无法分析瞬时性能指标,如最大内容绘制 (LCP)。
快照模式分析页面当前状态,适用于查找深层次表单或隐藏菜单的可访问性问题。不提供总分。
无法分析 DOM 之外的问题。

测试设备选择

  Lighthouse 支持两种设备类型:

  1. 移动设备模拟(默认)
  2. 桌面设备模拟

3.主要监测指标

  Lighthouse 监测多个维度的性能指标,以下是最重要的性能指标说明:

性能(Performance)

指标名称说明
首次内容绘制 (FCP)页面首次绘制 DOM 内容的时间,表示用户第一次看到页面内容的时间点。
最大内容绘制 (LCP)可视区域中最大内容元素呈现的时间,用于衡量主要内容的加载速度。
可交互时间 (TTI)页面完全可交互的时间点,表示浏览器可以快速响应用户操作的时刻。
总阻塞时间 (TBT)页面从首次内容绘制到完全可交互期间的总阻塞时间。
累积布局偏移 (CLS)页面布局的稳定性指标,衡量意外布局偏移对用户体验的影响。
速度指标 (SI)衡量页面内容在首屏可见的速度,值越小越佳。

可访问性(Accessibility)

检测网页的无障碍设计,包括对屏幕阅读器支持、颜色对比度、表单标签等。

最佳实践(Best Practices)

检测网页安全性和开发实践,例如是否启用 HTTPS,是否存在安全漏洞等。

SEO(Search Engine Optimisation)

评估网页的搜索引擎友好性,比如标题、元描述是否优化,页面是否允许爬取等。

渐进式 Web 应用(PWA)

验证网页是否符合 PWA 标准,如离线支持、安装性等。


4.如何使用 Lighthouse

  Lighthouse 可以通过多种方式运行:

  1. Chrome DevTools
    打开 Chrome 浏览器,右键点击页面 -> 检查 -> 切换到 Lighthouse 面板,选择测试选项,点击 分析页面加载

  1. CLI 命令行工具
  2. Chrome 插件
    在 Chrome 网上应用商店搜索 Lighthouse 插件,安装后直接在浏览器中生成报告。

  1. Node.js API
    使用 Node.js 脚本运行 Lighthouse 测试,适合高级开发者(官方介绍的,没用过)。

5.Lighthouse 报告解读

Lighthouse 报告为每个维度生成 0–100 的评分,并用颜色标识:

  • 绿色(90–100):表现优秀
  • 橙色(50–89):表现中等
  • 红色(0–49):表现较差

下面是关键性能指标的理想范围:

指标名称绿色(优秀)橙色(中等)红色(较差)
首次内容绘制 (FCP)0–1.8 秒1.8–3 秒>3 秒
最大内容绘制 (LCP)0–2.5 秒2.5–4 秒>4 秒
可交互时间 (TTI)0–3.8 秒3.9–7.3 秒>7.3 秒
总阻塞时间 (TBT)0–200 毫秒200–600 毫秒>600 毫秒
累积布局偏移 (CLS)0–0.10.1–0.25>0.25

6.性能优化建议

根据报告中提供的优化建议,可以从以下几个方面提升性能:

  1. 减少未使用的 JS 和 CSS
    • 使用代码分割和按需加载技术。
    • 删除无用的 CSS 和 JS 文件。
  2. 启用文本压缩
    • 配置服务器支持 gzip 或 Brotli 压缩。
  3. 优化图片加载
    • 使用下一代图片格式(如 WebP)。
    • 启用懒加载(Lazy Loading)。
  4. 消除渲染阻塞资源
    • 将关键 CSS 内联到 HTML 中。
    • 为非关键资源添加 asyncdefer 属性。
  5. 开启 HTTP/2
    • 改用 HTTP/2 协议,提高请求效率。
  6. 优化服务器响应时间
    • 使用 CDN 缓存静态资源。
    • 减少重定向请求。

……


总结

  Lighthouse 是前端性能优化的强大工具,通过全面的分析和详细的优化建议,开发者可以发现网页性能问题并进行改进。

参考资料:

  • Google Developers 文档
  • CSDN 博客

相关文章:

Lighthouse(灯塔)—— Chrome 浏览器性能测试工具

1.认识 Lighthouse Lighthouse 是 Google 开发的一款开源性能测试工具,用于分析网页或 Web 应用的性能、可访问性、最佳实践、安全性以及 SEO 等关键指标。开发人员可以通过 Lighthouse 快速了解网页的性能瓶颈,并基于优化建议进行改进。 核心功能&…...

深入浅出机器学习中的梯度下降算法

大家好,在机器学习中,梯度下降算法(Gradient Descent)是一个重要的概念。它是一种优化算法,用于最小化目标函数,通常是损失函数。梯度下降可以帮助找到一个模型最优的参数,使得模型的预测更加准…...

AIGC 012-Video LDM-更进一步,SD作者将LDM扩展到视频生成任务!

AIGC 012-Video LDM-Stable Video diffusion前身,将LDM扩展到视频生成任务! 文章目录 0 论文工作1论文方法实验结果 0 论文工作 Video LDM作者也是Stable diffusion的作者,作者在SD的架构上进行扩展,实现了视频的生成。后续在Vid…...

Rust常用命令总结

安装Rust 检查并更新Ubuntu的软件包 $ sudo apt update $ sudo apt upgrade安装相关依赖:安装GCC、G、MAKE、curl $ sudo apt install build-essential $ sudo apt install curl安装Rust $ curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh执行命令…...

docker部署RustDesk自建服务器

客户端: Releases rustdesk/rustdesk GitHub 服务端: 项目官方地址:GitHub - rustdesk/rustdesk-server: RustDesk Server Program 1、拉取RustDesk库 docker pull rustdesk/rustdesk-server:latest 阿里云库: docker pu…...

QT4和 QT5 槽函数连接的区别

正常连接方式 //QT4官方用列QLabel *label new QLabel;QScrollBar *scrollBar new QScrollBar;QObject::connect(scrollBar, SIGNAL(valueChanged(int)),label, SLOT(setNum(int)));//QT5官方用列QLabel *label new QLabel;QLineEdit *lineEdit new QLineEdit;QObject::c…...

【C++】入门【六】

本节目标 一、继承的概念及定义 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、复杂的菱形继承及菱形虚拟继承 八、继承的总结和反思 九、笔试面试题 一、继承的概念及定义 1.继承的概念 继承是面向对象…...

Ansible 运维工具

安装 apt install ansible /etc/ansible/hosts , 指定密码或密钥访问分组机器 [k8s_masters] master0.c0.k8s.sb[k8s_nodes] node0.c0.k8s.sb node1.c0.k8s.sb[k8s:children] k8s_masters k8s_nodes[k8s_masters:vars] ansible_ssh_usersbadmin ansible_ssh_pass"***&q…...

【分布式】分布式缓存

一、什么是分布式缓存 分布式缓存是一种将缓存数据存储在多个节点上的缓存方案。它通过将数据分散存储在多个节点的内存中,以提高系统的读取性能、降低数据库压力和提高系统可扩展性。 二、分布式缓存的优点 优点明细提高性能:分布式缓存可以将数据缓…...

uni-app简洁的移动端登录注册界面

非常简洁的登录、注册界面模板&#xff0c;使用uni-app编写&#xff0c;直接复制粘贴即可&#xff0c;无任何引用&#xff0c;全部公开。 废话不多说&#xff0c;代码如下&#xff1a; login.vue文件 <template><view class"content"><view class&quo…...

传奇996_47——前端ui

方式一&#xff1a; 后端写ui&#xff0c;前端通过触发函数进行截取。然后获取标签名进行补充或附加动画 这种方式很好用。 问题1&#xff1a;获取不到标签名&#xff0c;标签名就是标签id&#xff0c;当id数字时不需要处理即可直接获取到&#xff0c;但是id如果时汉字就会获取…...

nlp培训重点

1. SGD梯度下降公式 当梯度大于0时&#xff0c;变小&#xff0c;往左边找梯度接近0的值。 当梯度小于0时&#xff0c;减去一个负数会变大&#xff0c;往右边找梯度接近0的值&#xff0c;此时梯度从负数到0上升 2.Adam优化器实现原理 #coding:utf8import torch import torch.n…...

ARM A32多数据处理汇编指令理解分享

ARM A32多数据处理汇编指令理解分享 1 多数据存储指令1.1 push指令1.2 STMFD/STMDB指令1.3 STMED/STMDA指令1.4 STMFA/STMIB指令1.5 STMEA/STMIA指令 2 多数据加载指令2.1 pop指令2.2 LDMFD/LDMIA指令2.3 LDMFA/LDMDA指令2.4 LDMEA/LDMDB指令2.5 LDMED/LDMIB指令 在ARM A32多数…...

【人工智能】Transformers之Pipeline(二十七):蒙版生成(mask-generation)

​​​​​​​ 目录 一、引言 二、蒙版生成&#xff08;mask-generation&#xff09; 2.1 概述 2.2 facebook/sam-vit-base 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数 2.3.3 pipeline对象返回参数 2.4 pipeline实战 2.5 模型排…...

数据挖掘之逻辑回归

逻辑回归&#xff08;Logistic Regression&#xff09;是数据挖掘中一种经典且广泛应用的算法&#xff0c;主要用于解决分类问题。尽管名字中带有“回归”&#xff0c;它的核心目标却是预测离散的类别&#xff0c;而不是连续的数值。逻辑回归凭借其简单、高效、易于解释的特性&…...

PH热榜 | 2024-12-05

1. Oopsie 标语&#xff1a;用AI和会话回放调试Flutter和React Native应用 介绍&#xff1a;Zipy推出的Oopsie是一款你唯一需要的AI赋能移动端调试工具&#xff0c;它能提供▶️会话回放、&#x1f916;错误监控、&#x1f4a1;AI生成的概要分析&#xff0c;以及&#x1f525…...

docker-常用应用部署dockerfile模板

文章目录 概述Springboot-Djava.security.egdfile:/dev/./urandom参数说明 vue应用部署nginx.conf配置Dockerfile 概述 本文列举了Java开发中常用如SpringBoot、Vue前端等类型的应用Docker部署所需的DockerFile Springboot FROM anapsix/alpine-java:8_server-jre_unlimited…...

LabVIEW中“this VI‘s owning library is missing”错误及解决

问题描述 当加载或打开一个VI时&#xff0c;如果其所属的项目库未加载到内存&#xff0c;LabVIEW将提示错误&#xff1a;“this VIs owning library is missing”&#xff08;该VI的所属库不存在&#xff09;。 该问题通常发生在以下情况下&#xff1a; 项目库文件丢失或路径…...

【算法】棋盘覆盖问题源代码及精简版

目录 一、题目 二、样例 三、示例代码 四、精简代码 五、总结 对于棋盘覆盖问题的解答和优化。 一、题目 输入格式&#xff1a; 第一行&#xff0c;一个整数n&#xff08;棋盘n*n&#xff0c;n确保是2的幂次&#xff0c;n<64&#xff09; 第二行&#xff0c;两个整数…...

剖析kubernetes service的IP能否在宿主机中ping通

文章目录 前言一、serviceIP是怎么产生的二、宿主机中ping serviceIP地址1.ping示例2.为什么ping不通剖析2.1.封装及解封装过程2.2.ICMP报文以太网数据帧格式2.3.原因 三、ping不通svcIP是否跟iptables规则有关&#xff1f;四、为什么ipvs的的clusterIP类型的service能够ping通…...

路由VueRouter的基本使用

1.下载VueRouter到当前工程。 vue2&#xff1a;VueRouter3.x Vuex3.x。 vue3&#xff1a;VueRouter4.x Vuex4.x。 在终端使用命令&#xff1a; year add vue-router3.6.5 2.引入。 import VueRouter from vue-router 3,安装注册。 Vue.use(VueRouter) 4…...

学习记录,正则表达式, 隐式转换

正则表达式 \\&#xff1a;表示正则表达式 W: 表示一个非字&#xff08;不是一个字&#xff0c;例如&#xff1a;空格&#xff0c;逗号&#xff0c;句号&#xff09; W: 多个非字 基本组成部分 1.字符字面量&#xff1a; 普通字符&#xff1a;在正则表达式中&#xff0c;大…...

Spring Boot + MySQL 多线程查询与联表查询性能对比分析

Spring Boot MySQL: 多线程查询与联表查询性能对比分析 背景 在现代 Web 应用开发中&#xff0c;数据库性能是影响系统响应时间和用户体验的关键因素之一。随着业务需求的不断增长&#xff0c;单表查询和联表查询的效率问题日益凸显。特别是在 Spring Boot 项目中&#xff0…...

C++小碗菜之二:软件单元测试

“没有测试的代码重构不能称之为重构&#xff0c;它仅仅是垃圾代码的到处移动” ——Corey Haines 目录 前言 什么是单元测试&#xff1f; 单元测试的组成 单元测试的命名 单元测试的独立性 Google Test 单元测试的环境配置与使用 1. Ubuntu下安装 Google Test 2. 编写…...

集成学习综合教程

一、前置知识 一个分类器的分类准确率在60%-80%&#xff0c;即&#xff1a;比随机预测略好&#xff0c;但准确率却不太高&#xff0c;我们可以称之为 “弱分类器”&#xff0c;比如CART&#xff08;classification and regression tree 分类与回归树&#xff09;。 反之&#x…...

Java NIO channel

channel(通道)&#xff0c;byteBuffer(缓冲区)&#xff0c;selector&#xff08;io多路复用&#xff09;&#xff0c;通道FileChannel,SocketChannel的transferTo,transferFrom,MappedByteBuffer实现了零拷贝。 JVM调操作系统方法&#xff0c;read,write&#xff0c;都可以送字…...

B3631 单向链表-模拟链表

来源 &#xff1a;题目链接-洛谷 B3631 单向链表 单向链表 题目描述 实现一个数据结构&#xff0c;维护一张表&#xff08;最初只有一个元素 1 1 1&#xff09;。需要支持下面的操作&#xff0c;其中 x x x 和 y y y 都是 1 1 1 到 1 0 6 10^6 106 范围内的正整数&…...

【C++】格式化输出详解:掌握 cout 的进阶用法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;格式化输出的理论概述&#x1f4af;控制输出宽度和填充字符setw 操作符setfill 操作符 &#x1f4af;控制浮点数的显示格式fixed 与 scientificsetprecision &#x1f4af;…...

【NoSQL数据库】Hbase基本操作——数据库表的增删改查

目录 一、Hbase原理 二、HBase数据库操作 三、遇到的问题和解决方法 一、Hbase原理 HBase的数据模型&#xff1a; 行键 时间戳 列族&#xff1a;contents 列族&#xff1a;anchor 列族&#xff1a;mime “com.cnn.www” T9 Achor:cnnsi.com”CNN” T8 Achor:…...

同步fifo

同步FIFO FIFO即是一种先进先出的数据缓存器。同步FIFO指的是数据的写入和读出的时钟是同一个时钟。异步 FIFO 有两个时钟信号&#xff0c;读和写逻辑用的各自的读写时钟。 FIFO没有外部读写地址线&#xff0c;使用起来简单。但是缺点就是只能先入先出&#xff0c;数据地址由…...

肌肉骨骼肿瘤治疗市场:潜力无限,未来可期

肌肉骨骼肿瘤治疗作为现代医学的重要分支&#xff0c;专注于应对骨骼和肌肉系统中的良性和恶性肿瘤。随着全球人口老龄化和生活方式的改变&#xff0c;肌肉骨骼疾病日益成为公共卫生的重要问题。与此同时&#xff0c;医疗技术的进步和患者对高质量医疗服务的需求不断推动该市场…...

高考倒计时:用倒计时软件 为梦想加油 可用于教室黑板或者电脑上

高考&#xff0c;这个被无数学子视为人生重要转折点的考试&#xff0c;即将来临。每一年的六月&#xff0c;都充满了紧张与期待。如何在这场人生的战役中取得胜利&#xff1f;除了日常的勤奋学习&#xff0c;科学的复习计划和心态调整外&#xff0c;一款好用的倒计时软件&#…...

人工智能学习用的电脑安装cuda、torch、conda等软件,版本的选择以及多版本切换

接触人工智能的学习三个月了&#xff0c;每天与各种安装包作斗争&#xff0c;缺少依赖包、版本高了、版本低了、不兼容了、系统做一半从头再来了。。。这些都是常态。三个月把单位几台电脑折腾了不下几十次安装&#xff0c;是时候总结一下踩过的坑和积累的经验了。 以一个典型的…...

BERT模型的输出格式探究以及提取出BERT 模型的CLS表示,last_hidden_state[:, 0, :]用于提取每个句子的CLS向量表示

说在前面 最近使用自己的数据集对bert-base-uncased进行了二次预训练&#xff0c;只使用了MLM任务&#xff0c;发现在加载训练好的模型进行输出CLS表示用于下游任务时&#xff0c;同一个句子的输出CLS表示都不一样&#xff0c;并且控制台输出以下警告信息。说是没有这些权重。…...

InfluxDB 集成 Grafana

将InfluxDB集成到Grafana进行详细配置通常包括以下几个步骤&#xff1a;安装与配置InfluxDB、安装与配置Grafana、在Grafana中添加InfluxDB数据源以及创建和配置仪表板。以下是一个详细的配置指南&#xff1a; 一、安装与配置InfluxDB 下载与安装&#xff1a; 从InfluxDB的官…...

Vue跨标签通讯(本地存储)(踩坑)

我司有一个需求【用户指引】 需求是根标签有一个用户指引总开关&#xff0c;可以控制页面所有的用户指引是否在页面进入后初始是否默认打开&#xff0c;但是有些页面会新开标签这就设计到跨标签通讯了 我采取的方案是本地存储 重点:首先本地存储在页面是同源(即域名协议端口三…...

掌握创意之钥:全面解析HTML5 Canvas

在数字时代&#xff0c;表达创意的方式多种多样&#xff0c;而 HTML5 中的 <canvas> 元素无疑为网页开发者提供了一个强大的工具箱。无论你是想要创建动态图表、互动游戏还是复杂的可视化应用&#xff0c;掌握 Canvas 的基本用法都是迈向成功的关键一步。本文将带你一步步…...

mac port 安装redis 并设置为系统服务 自定义配置方法

mac系统中&#xff0c;port 包管理工具比brew的速度快N倍&#xff0c;今天就给大家分享一下在macos系统中如何使用 port安装 redis数据库并配置为服务自动启动和自定义redis.conf配置的方法。 1. 安装redis sudo port install redis 2. 启动redis服务 sudo port load redis …...

Agent AI: Surveying the Horizons of Multimodal Interaction---摘要、引言、代理 AI 集成

题目 智能体AI:多模态交互视野的考察 论文地址&#xff1a;https://arxiv.org/abs/2401.03568 图1&#xff1a;可以在不同领域和应用程序中感知和行动的Agent AI系统概述。Agent AI是正在成为通用人工智能&#xff08;AGI&#xff09;的一个有前途的途径。Agent AI培训已经证…...

二百七十八、ClickHouse——将本月第一天所在的那一周视为第一周,无论它是从周几开始的,查询某个日期是本月第几周

一、目的 ClickHouse指标表中有个字段week_of_month&#xff0c;含义是这条数据属于本月第几周。 而且将本月第一天所在的那一周视为第一周&#xff0c;无论它是从周几开始的。比如2024-12-01是周日&#xff0c;即12月第一周。而2024-12-02是周一&#xff0c;即12月第二周 二…...

Unity 相机旋转及角度限制

前言 由于欧拉角具有直观的可读性&#xff0c;做相机旋转时选择修改eulerAngles 来实现旋转&#xff0c;但实际效果与预期稍有不同&#xff0c;这是因为欧拉角受到万向锁&#xff08;Gimbal Lock&#xff09;的影响&#xff0c;在赋值时需要对输入的角度进行调整。 if (value…...

基于CentOS系统利用Kamailio搭建企业级SIP服务器

一、Kamailio简介 Kamailio是一款开源的SIP服务器&#xff0c;具有高性能、可扩展、模块化等特点。它广泛应用于VoIP、即时通讯、视频会议等领域。Kamailio支持多种操作系统&#xff0c;如Linux、FreeBSD等&#xff0c;可以与其他开源项目&#xff08;如 Asterisk、FreeSWITCH…...

部署项目报错

vue2项目部署后 Error: Cannot find module /views/*** 1.起因 登录页、首页等静态页面可以正常进入&#xff0c;后端访问也正常&#xff0c;可以获取到验证码。 但是登录之后会发现首页空白或者进入不到首页 F12查看有报错信息&#xff1a;Error: Cannot find module ‘/v…...

【AIGC】大模型面试高频考点-位置编码篇

【AIGC】大模型面试高频考点-位置编码篇 &#xff08;一&#xff09;手撕 绝对位置编码 算法&#xff08;二&#xff09;手撕 可学习位置编码 算法&#xff08;三&#xff09;手撕 相对位置编码 算法&#xff08;四&#xff09;手撕 Rope 算法&#xff08;旋转位置编码&#xf…...

钓鱼攻击详解:鱼叉攻击与水坑攻击

钓鱼攻击详解&#xff1a;鱼叉攻击与水坑攻击 在现代网络安全领域中&#xff0c;钓鱼攻击&#xff08;Phishing&#xff09;是一种最常见且有效的攻击手段。它通过欺骗用户&#xff0c;引导其泄露敏感信息或执行恶意操作&#xff0c;从而为攻击者打开大门。本文将深入介绍两种…...

如何在自动化安全测试中,实现多工具集成与数据融合,以提高对Spring Boot应用程序安全漏洞的检测效率与准确性?

为了在自动化安全测试中实现多工具集成与数据融合&#xff0c;以提高对Spring Boot应用程序安全漏洞的检测效率与准确性&#xff0c;可以采取以下策略和方法&#xff1a; 文章目录 1. 工具选择与集成2. 数据标准化与聚合3. 数据分析与融合4. 持续改进5. 实施示例 1. 工具选择与…...

框架篇面试

一、Spring框架中的单例bean的安全性 Spring框架中有一个Scope注解&#xff0c;默认的值就是singleton&#xff0c;单例的&#xff1b;因为一般在spring的bean中注入的都是无状态的对象&#xff0c;所以没有线程安全问题。但是如果在bean中定义了可修改的成员变量&#xff0c;…...

STM32滴答定时器SysTick理解+时基设置(4.1)

文章目录 1. 什么是滴答定时器&#xff1f;2. SysTick定时器初始化2.1 systick定时器时钟源&#xff1f;2.2 定时器四个寄存器 3 函数设置3.1SysTick_Config&#xff08;uint32_t ticks&#xff09;函数3.2初始化函数 4. 延时函数实现4.1 ms延时思路及实现4.2 us延时 1. 什么是…...

数字化时代下的企业合规管理:全球化背景下的挑战与机遇

在全球化浪潮的推动下&#xff0c;企业合规管理已成为企业发展中不可或缺的一部分。随着各国法规日益严格&#xff0c;以及数字化技术的飞速发展&#xff0c;企业在扩展业务的同时&#xff0c;也面临着越来越多的合规挑战。有效的合规管理不仅有助于提高企业的管理水平和运营效…...

读《Effective Java》笔记 - 条目17

条目17&#xff1a;使可变性最小化 为什么要使可变性最小化&#xff1f; 不可变对象天然是线程安全的&#xff0c;可以在多个线程之间安全共享。而可变对象需要添加额外的同步机制保证线程安全。不可变对象一旦创建就不会改变&#xff0c;便于追踪和理解代码。而可变对象的状态…...