JVM之Java内存模型
Java内存模型(Java Memory Model,简称JMM)是Java虚拟机(JVM)规范中定义的一套规则,用于描述多线程环境下变量如何被访问和同步。在多线程编程中,内存模型的重要性不言而喻,它直接关系到程序的正确性和性能。本文将深入探讨Java内存模型的原理、特性、示例以及总结。
一、基本概念
1. 主内存与工作内存
- 主内存:主内存是JVM中所有线程共享的内存区域,用于存储Java程序中的变量和对象实例等数据。所有的共享变量都存储在主内存中,包括实例字段、静态字段和数组元素等。
- 工作内存:每个线程都有自己的工作内存,也称为本地内存。工作内存是线程私有的,用于存储主内存中共享变量的副本。线程对变量的所有操作(读取、写入)都在工作内存中进行,而不是直接操作主内存。
2. 内存交互操作
JMM定义了以下八种操作来完成主内存和工作内存之间的交互:
- lock(锁定):作用于主内存的变量,将变量标识为一条线程独占状态。
- unlock(解锁):作用于主内存的变量,释放处于锁定状态的变量,允许其他线程锁定该变量。
- read(读取):作用于主内存的变量,将变量值从主内存传输到线程的工作内存中。
- load(载入):作用于工作内存的变量,将read操作从主内存中得到的变量值放入工作内存的变量副本中。
- use(使用):作用于工作内存的变量,将工作内存中的一个变量值传递给执行引擎。
- assign(赋值):作用于工作内存的变量,将执行引擎接收到的值赋给工作内存的变量。
- store(存储):作用于工作内存的变量,将工作内存中的一个变量的值传送到主内存中。
- write(写入):作用于主内存的变量,将store操作从工作内存中得到的变量的值放入主内存的变量中。
三、特性
1. 原子性(Atomicity)
- 定义:一个或多个操作,要么全部执行,要么全部不执行,在执行过程中不会被任何因素打断。
- 实现方式:在Java中,对基本数据类型的访问和操作是原子的,例如对int、long、short、byte、char、boolean和reference类型的读写操作都是原子的。对于复合操作(如i++),则需要通过同步机制(如synchronized、Lock等)来保证原子性。
2. 可见性(Visibility)
-
定义:一个线程对共享变量的修改,能够被其他线程看到。
-
实现方式:Java内存模型通过volatile关键字和synchronized关键字来实现可见性。
- volatile关键字:当一个变量被声明为volatile时,对该变量的读写操作都会直接作用于主内存,从而保证了可见性。但是,volatile关键字不能保证操作的原子性。
- synchronized关键字:synchronized关键字通过锁定机制来确保只有一个线程可以执行一段代码。当一个线程访问一个对象的synchronized方法或代码块时,它将获得该对象的锁,其他线程则必须等待。在解锁之前对变量的修改对其他线程是可见的。
3. 有序性(Ordering)
- 定义:程序执行的顺序按照代码的先后顺序执行。
- 实现方式:Java内存模型通过Happens-Before原则来定义操作之间的偏序关系,从而允许一定程度的重排序,但同时又保证程序最终执行的结果与预期一致。
三、Happens-Before原则
Happens-Before原则是Java内存模型中定义的一组偏序关系,用于判断两个操作之间的内存可见性和有序性。它包括以下几种情况:
* 程序次序规则:
一个线程中的每个操作,Happens-Before于该线程中的任意后续操作。
* 监视器锁规则:
对一个锁的解锁,Happens-Before于随后对这个锁的加锁。
* volatile变量规则:
对一个volatile变量的写,Happens-Before于任意后续对这个volatile变量的读。
* 传递性:
如果A Happens-Before B,且B Happens-Before C,那么A Happens-Before C。
* 线程启动规则:
Thread对象的start()方法调用Happens-Before于该线程的每一个动作。
* 线程终止规则:
线程的所有操作都Happens-Before于其他线程检测到这个线程已经终止。
* 线程中断规则:
对线程interrupt()方法的调用Happens-Before于被中断线程的代码检测到中断事件的发生。
* 对象终结规则:
一个对象的初始化完成(构造函数执行结束)Happens-Before于它的finalize()方法的开始。
四、代码示例
1. 可见性示例
代码示例:
public class VisibilityExample {private static boolean ready;private static int number;public static void main(String[] args) throws InterruptedException {Thread one = new Thread(() -> {number = 42;ready = true; // ①});Thread two = new Thread(() -> {while (!ready) {Thread.onSpinWait(); // ②}System.out.println(number); // ③});one.start();two.start();one.join();}
}
问题分析:
- 在这个例子中,线程one设置了number的值并标记ready为true。线程two在一个循环中等待ready变为true,然后打印number的值。
- 如果没有正确的同步机制,线程two可能看不到线程one对number和ready的修改,因为这两个线程的工作在不同的内存区域中。这可能导致线程two打印出number的初始值(0),而不是线程one设置的值(42)。
解决方案:
- 可以使用volatile关键字或synchronized关键字来确保内存可见性。在这个例子中,如果将ready声明为volatile,则线程one对ready的修改将立即对线程two可见,从而确保线程two能够正确打印出number的值。
修改后的代码:
public class VisibilityExample {private static volatile boolean ready; // 使用volatile关键字private static int number;public static void main(String[] args) throws InterruptedException {Thread one = new Thread(() -> {number = 42;ready = true; // ①});Thread two = new Thread(() -> {while (!ready) {Thread.onSpinWait(); // ②}System.out.println(number); // ③});one.start();two.start();one.join();}
}
2. 有序性示例
代码示例:
public class Singleton {private static Singleton instance;public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
问题分析:
-
在这个例子中,Singleton类使用了双重检查锁定(Double-Checked Locking)模式来确保单例模式的安全性。
-
然而,由于指令重排序的存在,这种实现方式在某些情况下可能会出现问题。具体来说,new Singleton()这个操作实际上会有以下三个步骤:
- 分配一块内存M。
- 在内存M上初始化Singleton对象。
- 将M的地址赋值给instance变量。
-
如果发生指令重排序,顺序可能会变为:
- 分配一块内存M。
- 将M的地址赋值给instance变量。
- 在内存M上初始化Singleton对象。
-
在这种情况下,如果线程A在执行到步骤2时发生线程切换,切换到线程B。线程B在执行getInstance()方法时,会发现instance不为null,因此直接返回instance。然而,此时的instance对象可能还没有被初始化,如果此时访问instance的成员变量就可能触发空指针异常。
解决方案:
- 可以通过在对象引用前添加volatile关键字来解决这个问题。volatile关键字可以禁止指令重排序,确保对象在初始化完成后再将引用赋值给变量。
修改后的代码:
public class Singleton {private static volatile Singleton instance;public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
五、内存模型与硬件内存架构的关系
Java内存模型并不是对硬件内存架构的简单模拟,而是对其的一种抽象和简化。现代计算机为了高效运行,在CPU与内存之间设置了高速缓存(Cache)作为数据缓冲,这一机制在多线程环境下可能会引发缓存一致性问题。
为了解决这个问题,处理器需要遵循一些缓存一致性协议,如MSI、MESI(Modified, Exclusive, Shared, Invalid)等。这些协议确保了多个处理器核心在访问共享内存时,能够保持数据的一致性。例如,在MESI协议中,缓存行(Cache Line)有四种状态:修改(Modified)、独占(Exclusive)、共享(Shared)和无效(Invalid)。通过这些状态,处理器可以跟踪缓存行的数据是否与其他核心保持一致。
Java内存模型(JMM)在设计时,考虑了这些硬件层面的缓存一致性问题。JMM定义了一套规范,用于描述变量在内存中的存储方式、线程如何读取和写入内存中的变量,以及这些操作如何与其他线程进行同步。JMM的核心目标是确保在多线程环境中,程序的执行结果具有可预测性,即程序的行为与单线程环境下的行为一致(在遵守JMM规则的前提下)。
为了实现这一目标,JMM引入了几个关键概念:
1. 主内存与工作内存:
JMM将内存分为两部分:主内存(Main Memory)和工作内存(Working Memory)。主内存是所有线程共享的,它存储了程序中的所有变量。每个线程都有自己的工作内存,它是线程私有的,存储了线程从主内存中读取的变量的副本。线程对变量的所有读写操作都必须在工作内存中进行,不能直接操作主内存中的变量。
2. volatile关键字:
volatile是Java中的一个关键字,用于修饰变量。被volatile修饰的变量具有可见性和有序性两个特性。可见性意味着当一个线程修改了volatile变量的值,其他线程会立即看到这个修改。有序性则限制了编译器和处理器对volatile变量相关操作的重排序,从而保证了程序执行的正确性。
3. 原子性、可见性和有序性:
原子性是指操作是不可中断的,要么全部执行完,要么完全不执行。可见性是指一个线程对共享变量的修改对其他线程是可见的。有序性是指程序执行的顺序是按照代码的顺序来的(在遵守JMM规则的前提下)。JMM通过一系列规则来保证这三个特性的实现。
4. 先行发生原则(Happens-Before):
这是JMM定义的一种偏序关系,用于描述两个操作之间的执行顺序。如果操作A先行发生于操作B,那么操作A对共享变量的影响在操作B中是可见的。先行发生原则是判断数据是否存在竞争、线程是否安全的主要依据。
总结
Java内存模型(JMM)是JVM规范中定义的多线程环境下变量访问和同步的规则。它抽象了硬件内存架构,分为主内存和工作内存,线程通过工作内存与主内存交互。JMM保证了原子性、可见性和有序性,其中volatile和synchronized是关键实现方式。Happens-Before原则定义了操作间的偏序关系,确保内存可见性和有序性。示例展示了可见性和有序性问题及解决方案。JMM还考虑了硬件缓存一致性问题,通过规范确保多线程环境下程序执行的可预测性。
相关文章:
JVM之Java内存模型
Java内存模型(Java Memory Model,简称JMM)是Java虚拟机(JVM)规范中定义的一套规则,用于描述多线程环境下变量如何被访问和同步。在多线程编程中,内存模型的重要性不言而喻,它直接关系…...
matlab系列专栏-快捷键速查手册
目录 1在命令窗口(Command Window)中 2. 在编辑器(Editor)(m文件)中 1在命令窗口(Command Window)中 1)【↑、↓】——切换到之前、之后运行过的命令,可以重复按多次来达到想要的命令。 2)【Tab】——自动补全。在Command窗口,…...
快手一面-面经
1. RPC和Http的区别? RPC(Remote Procedure Call,远程过程调用)和 HTTP(HyperText Transfer Protocol,超文本传输协议)是两种不同的通信机制,它们有不同的用途、工作原理和应用场景…...
<style lang=“scss“ scoped>: 这是更常见的写法,也是官方文档中推荐的写法
这两种写法在大多数情况下是没有区别的,它们都是 Vue.js 单文件组件 (.vue 文件) 中用来定义组件私有样式的方式。 两种写法: <style lang"scss" scoped>: 这是更常见的写法,也是官方文档中推荐的写法。<style scoped l…...
cerebro关闭ssl
cerebro连接es报错 io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: (certificate_unknown) Received fatal alert: certificate_unknown 在cerebro的application.conf配置文件中添加 play.ws.ssl.loose.acceptAnyCertificate true Disab…...
网络安全常见的问题
1. 什么是 DDoS 攻击?如何防范? 答:DDoS 攻击是指利用大量的计算机或者其他网络设备,同时向目标网络或者服务器 发送 大量的数据流量,以致其无法正常工作,从而导致网络瘫痪或者服务器宕机的攻击行 为。 …...
Eclipse配置Tomcat服务器(最全图文详解)
前言: 本章使用图文讲解如何在Eclipse开发工具中配置Tomcat服务器、如何创建和启动JavaWeb工程,欢迎童鞋们互相交流。觉得不错可以三连订阅喔。 目标: 一、配置Tomcat服务器 1. 切换Eclipse视图 2. 打开菜单 3. 找到服务选项 4. 选择…...
mv指令详解
🏝️专栏:https://blog.csdn.net/2301_81831423/category_12872319.html 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 基本语法 主要功能 常用选项详解 1. …...
SQL从入门到实战
学前须知 sqlzoo数据介绍 world nobel covid ge game、goal、eteam teacher、dept movie、casting、actor 基础语句 select&from SELECT from WORLD Tutorial - SQLZoo 基础查询select单列&多列&所有列&别名应用 例题一 SELECT name, continent, population …...
回归中医传统 重铸中医之魂 — 薛应中 —
最近做了一个20次课的讲义纲要,每节课都是中医理念下某一类疾病的认知与诊疗,或是一个重大健康观念的辨析,准备陆续和各届人士一起探讨。 下面就算是一个序言,主要是做一个自我介绍,将自己的一点心得,结合我的行医经历,以及学习中医的治学之道等,做一个开场白。 (一)中医的有…...
什么是面向对象?
面向对象编程(Object-Oriented Programming,简称OOP)是一种流行的编程方法,它以对象和类为基础构建软件。该编程范式围绕“对象”这一基本概念展开,其中对象被视为包含数据和行为的软件构件。以下是对面向对象编程的深…...
HDFS读写流程
因为namenode维护管理了文件系统的元数据信息,这就造成了不管是读还是写数据都是基于NameNode开始的,也就是说NameNode成为了HDFS访问的唯一入口。入口地址是:http://nn_host:8020。 一、写数据流程 1.1 Pipeline管道、ACK应答响应 Pipeline…...
HDFS Federation联邦机制
一、当前HDFS体系架构 1.1 简介 当前的HDFS架构有两个主要的层: 命名空间(namespace) HDFS体系结构中的命名空间层由文件,块和目录组成。该层支持与名称空间相关的文件系统操作,例如创建,删除࿰…...
机器学习周报-ModernTCN文献阅读
文章目录 摘要Abstract 0 提升有效感受野(ERF)1 相关知识1.1 标准卷积1.2 深度分离卷积(Depthwise Convolution,DWConv)1.3 逐点卷积(Pointwise Convolution,PWConv)1.4 组卷积(Grou…...
QT RC_FILE 应用程序图标设置
1.先做一个app.ico 文件,并将文件放入资源文件夹中 2.打开QT项目的.pro文件在最下面增加 RC_FILE $$PWD/res/app.rc 3.在资源文件夹中创建一个app.rc文件。在QT开发工具中编辑并输入下在内容 IDI_ICON1 ICON "app.ico" 4.测试效果...
5G学习笔记之SNPN系列之网络选择
目录 0. NPN系列 1. 概述 2. 自动网络选择 3. 手动网络选择 0. NPN系列 1. NPN概述 2. NPN R18 3. 【SNPN系列】SNPN ID和广播消息 4. 【SNPN系列】UE入网和远程配置 5. 【SNPN系列】SNPN选择 6. PNI-NPN 1. 概述 对于某个特定的UE,可以仅支持SNPN接入模式&#x…...
k8s helm部署kafka集群(KRaft模式)——筑梦之路
添加helm仓库 helm repo add bitnami "https://helm-charts.itboon.top/bitnami" --force-update helm repo add grafana "https://helm-charts.itboon.top/grafana" --force-update helm repo add prometheus-community "https://helm-charts.itboo…...
Redis学习笔记
目录 Nosql概述 为什么用Nosql 什么是Nosql Nosql四大分类 Redis入门 概述 Windows安装 Linux安装 测试性能 基础知识 五大数据类型 Redis-Key String(字符串) List(列表) Set(集合) Hash(哈希) Zset(有…...
mysql递归查询语法WITH RECURSIVE
WITH RECURSIVE 是 SQL 中用于执行递归查询的语法,特别适合于处理层级结构或递归数据(如树形结构、图结构)。递归查询可以反复引用自己来查询多层次的数据,而无需写多个嵌套查询。 基本语法结构: WITH RECURSIVE CTE…...
Go语言之十条命令(The Ten Commands of Go Language)
Go语言之十条命令 Go语言简介 Go语言(又称Golang)是由Google开发的一种开源编程语言,首次公开发布于2009年。Go语言旨在提供简洁、高效、可靠的软件开发解决方案,特别强调并发编程和系统编程。 Go语言的基本特征 静态强类…...
Visual Studio 2022 C++ gRPC 环境搭建
文章目录 1、gRPC 安装2、创建项目2.1、创建 “空的解决方案”2.2、新建 gRPCServer 和 gRPCClient 项目2.3、创建 proto 文件 2、为 gRPC 服务端和客服端项目配置 protobuf 编译2.1、protobuf 配置2.2、gRPCServer 项目配置2.3、gRPCClient 项目配置 3、测试3.1、启动服务端程…...
2024AAAI SCTNet论文阅读笔记
文章目录 SCTNet: Single-Branch CNN with Transformer Semantic Information for Real-Time Segmentation摘要背景创新点方法Conv-Former Block卷积注意力机制前馈网络FFN 语义信息对齐模块主干特征对齐共享解码头对齐 总体架构backbone解码器头 对齐损失 实验SOTA效果对比Cit…...
【Java从入门到放弃 之 final 关键字】
final 关键字 final 关键字final 字段final 函数列表中的参数final 方法final 类 final 关键字 Java中里面有final这个关键字,这个关键字总体上是用来表达” 不能被改变“ 这个意思的。我们使用这个关键字表达不能被改变,有两种使用场景,有三…...
【U8+】用友U8软件中,出入库流水输出excel的时候提示报表输出引擎错误。
【问题现象】 通过天联高级版客户端登录拥有U8后, 将出入库流水输出excel的时候,提示报表输出引擎错误。 进行报表输出时出现错误,错误信息:找不到“fd6eea8b-fb40-4ce4-8ab4-cddbd9462981.htm”。 如果您正试图从最近使用的文件列…...
文本区域提取和分析——Python版本
目录 1. 图像预处理 2. 文本区域提取 3. 文本行分割 4. 文本区域分析 5. 应用举例 总结 文本区域提取和分析是计算机视觉中的重要任务,尤其在光学字符识别(OCR)系统、文档分析、自动化数据录入等应用中有广泛的应用。其目标是从图像中提…...
数据库介绍(不同数据库比较)
文章目录 **一、关系型数据库(RDBMS)****1. MySQL****优点**:**缺点**:**适用场景**: **2. PostgreSQL****优点**:**缺点**:**适用场景**: **3. Oracle Database****优点**ÿ…...
注意力的简单理解,有哪些注意力(Attention)
注意力(Attention) 目录 注意力(Attention)掩码注意力机制自注意力、交叉注意力、掩码注意力的不同点适应场景及举例多头注意分层注意力(Hierarchical Attention)协同注意力(Co - Attention)自注意力(Self - Attention) 简单理解:自注意力就像是一个句子(或序列)内…...
基于Python的投资组合收益率与波动率的数据分析
基于Python的投资组合收益率与波动率的数据分析 摘要:該文通过研究马科维茨的投资组合模型,并将投资组合模型应用到包含6只金融股票的金融行业基金中。首先通过开源的财经接口Tushare获取股票原始数据,接着利用数据分析的黄金组合库…...
《Opencv》图像的旋转
一、使用numpy库实现 np.rot90(img,-1) 后面的参数为-1时事顺时针旋转,为1时是逆时针旋转。 import cv2 import numpy as np img cv2.imread(./images/kele.png) """方法一""" # 顺时针90度 rot_1 np.rot90(img,-1) # 逆时针90度…...
Python 22:注释
1. 定义: 用熟悉的语言对代码进行解释说明。注释不会被执行。 2. 注释分类 单行注释:只能对一行代码进行注释。放在要注释的代码后面,用#进行分隔,中间至少空2个空格,保证代码规范。 print("hello world10"…...
python:利用神经网络技术确定大量离散点中纵坐标可信度的最高集中区间
当我们有许多离散点并想要确定纵坐标在某个区间内的可信度时,我们可以使用神经网络模型来解决这个问题。下面是一个使用Python编写的示例代码,展示了如何使用神经网络来确定大量离散点中纵坐标可信度的最高集中区间。 import numpy as np from sklearn.…...
计算机软件保护条例
(2001年12月20日中华人民共和国国务院令第339号公布 根据2011年1月8日《国务院关于废止和修改部分行政法规的决定》第一次修订 根据2013年1月30日《国务院关于修改〈计算机软件保护条例〉的决定》第二次修订) 第一章 总则 第一条 为了保护计算机软件著作权人的权益&#…...
CM3/4启动流程
CM3/4启动流程 1. 启动模式2. 启动流程 1. 启动模式 复位方式有三种:上电复位,硬件复位和软件复位。 当产生复位,并且离开复位状态后,CM3/4 内核做的第一件事就是读取下列两个 32 位整数的值: 从地址 0x0000 0000 处取…...
gaussdb中怎么查询一个表有多少GB
在 GaussDB 中,你可以通过多种方法查询一个表的大小,包括使用系统视图和内置函数。以下是几种常见的方法: 1. 使用 pg_total_relation_size 函数 pg_total_relation_size 函数返回一个表及其所有索引和 TOAST 数据的总大小。 示例查询 SE…...
2025-01-06 Unity 使用 Tip2 —— Windows、Android、WebGL 打包记录
文章目录 1 Windows2 Android2.1 横版 / 竖版游戏2.2 API 最低版本2.3 目标帧率2.3.1 targetFrameRate2.3.2 vSyncCount2.3.3 Unity 默认设置以及推荐设置2.3.4 Unity 帧率托管 3 WebGL3.1 平台限制3.2 打包报错记录 13.3 打包报错记录 2 最近尝试将写的小游戏打包ÿ…...
OP-TEE环境飞腾密码引擎编程指南
【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适…...
解密Navicat密码(Java)
最近从Navicat换到了DBeaver,导出配置文件发现配置文件里的密码都是加密的,看网上的都是给的PHP代码,因为环境问题,就算是在线上运行的PHP代码也会报错,所以就把这段代码改成Java了。 package com.unicdata.system.con…...
apex安装
安装过程复杂曲折,网上说的很多办法,貌似成功了,实际还是没起作用。 先说成功过程,执行下面命令,安装成功(当然,前提是你要先配置好编译环境): (我的环境&a…...
常见的开源网络操作系统
常见的开源网络操作系统有很多,它们通常用于路由器、交换机、网络设备和服务器等场景,具有灵活、可定制、易于扩展的特点。以下是一些常见的开源网络操作系统: OpenWRT 用途:主要用于路由器、无线接入点和网络设备。提供了广泛的定制选项和高级功能,如防火墙配置、VPN 支持…...
2024年6月英语六级CET6听力原文与解析
目录 0 序言 1.Long Conversation(长对话) 1.1 Blender 搅拌机 1.2 村庄的改造变化 2.Passage 2.1 micro robots 微型机器人 2.2 elite sleeper 睡眠精英 3.Lecture 3.1 对自身观念变化的低察觉度及相关研究发现 3.2 美国母亲群体数量变化及母亲节消费趋势分析 3.3 …...
力扣2-回文数
一.题目 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文&…...
基于springboot的网上商城购物系统
作者:学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”,支持远程部署调试、运行安装。 目录 项目包含: 开发说明: 系统功能: 项目截图…...
业务日志设计
当一个项目足够大的时候,我们需要将统计系统完全独立出去,那么就无法避免数据采集的问题,我们可以在业务触发处增加log日志来记录当前变化的原始数据,提供统计系统进行采集 设计一个统计系统的日志记录机制时,主要需要…...
梯度下降方法
2.5 梯度下降方法介绍 学习目标 掌握梯度下降法的推导过程知道全梯度下降算法的原理知道随机梯度下降算法的原理知道随机平均梯度下降算法的原理知道小批量梯度下降算法的原理 上一节中给大家介绍了最基本的梯度下降法实现流程,本节我们将进一步介绍梯度下降法的详细…...
javascript
引入方式 JavaScript 程序不能独立运行,它需要被嵌入 HTML 中,然后浏览器才能执行 JavaScript 代码。通过 script 标签将 JavaScript 代码引入到 HTML 中,有两种方式: 内部方式 通过 script 标签包裹 JavaScript 代码 <!DO…...
大语言模型训练所需的最低显存,联邦大语言模型训练的传输优化技术
联邦大语言模型训练的传输优化技术 目录 联邦大语言模型训练的传输优化技术大语言模型训练所需的最低显存大语言模型训练所需的最低显存 基于模型微调、压缩和分布式并行处理的方法,介绍了相关开源模型及技术应用 核心创新点 多维度优化策略:综合运用基于模型微调、模型压缩和…...
二叉树的二叉链表和三叉链表
在二叉树的数据结构中,通常有两种链表存储方式:二叉链表和三叉链表。这里,我们先澄清一下概念,通常我们讨论的是二叉链表,它用于存储二叉树的节点。而“三叉链表”这个术语在二叉树的上下文中不常见,可能是…...
api开发如何在代码中使用京东商品详情接口的参数?
选择编程语言和相关工具 以 Python 为例,你可以使用requests库来发送 HTTP 请求获取接口数据。如果是 Java,可以使用OkHttp等库。 Python 示例 假设你已经安装了requests库,以下是一个简单的代码示例来获取和使用京东商品详情接口参数&#…...
Quartz如何实现分布式调度
系列文章目录 任务调度管理——Quartz入门 Quartz如何实现分布式控制 系列文章目录一、持久化二、分布式调度1. 表信息2. 调度器的竞争3. 触发器的分配 三、 总结 我们都说Quartz是个分布式调度框架,那么在分布式环境上,如何使得各个服务器上的定时任务…...
JUC--线程池
线程池 七、线程池7.1线程池的概述7.2线程池的构建与参数ThreadPoolExecutor 的构造方法核心参数线程池的工作原理 Executors构造方法newFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutornewScheduledThreadPool(int corePoolSize) 为什么不推荐使用内置线程池&…...