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

JVM——Java内存模型

Java内存模型

在Java多线程编程中,Java内存模型(Java Memory Model, JMM)是理解程序执行行为和实现线程安全的关键。下面我们深入探讨Java内存模型的内容。

Java内存模型概述

Java内存模型定义了Java程序中变量的内存操作规则,以及线程之间的通信语义。它屏蔽了底层硬件和操作系统的差异,为Java程序员提供了一个统一的内存访问视图。在JMM中,每个线程都有自己的工作内存,而共享变量存储在主内存中。线程对变量的所有操作都必须通过工作内存进行,不能直接读写主内存中的变量。工作内存中的变量是主内存中变量的副本,线程之间的通信必须通过主内存进行。

happens-before关系与内存可见性

(一)happens-before关系定义

happens-before关系是Java内存模型中的核心概念之一,用于描述两个操作之间的内存可见性。如果操作X happens-before操作Y,那么X的执行结果对Y是可见的。JMM通过定义一系列规则来确定两个操作之间是否存在happens-before关系:

  1. 程序顺序规则:在单线程中,按照代码的顺序,前面的操作happens-before后面的操 作。但这并不意味着指令不能重排序,只是重排序后必须保证单线程内的结果与顺序执行一致。
  2. 监视器锁规则:一个解锁操作happens-before于后续对同一把锁的加锁操作。这保证了线程释放锁后,其他线程获取锁时能看到之前线程对共享变量的修改。
  3. volatile变量规则:对一个volatile变量的写操作happens-before于后续对同一变量的读操作。这确保了volatile变量的修改对其他线程立即可见。
  4. 线程启动规则:线程的启动操作happens-before于该线程的其他操作。这使得新启动的线程能看到创建线程对共享变量的初始化操作。
  5. 线程终止规则:线程的所有操作happens-before于其他线程检测到该线程已经终止(如通过Thread.join()或Thread.isAlive()判断)。
  6. 中断规则:一个线程的中断操作happens-before于被中断线程检测到中断事件。
  7. 传递性:如果操作A happens-before操作B,操作B happens-before操作C,那么操作A happens-before操作C。

(二)内存可见性问题

在多线程环境下,由于每个线程都有自己的工作内存,线程对共享变量的修改可能无法及时同步到主内存,导致其他线程无法看到最新的值。happens-before关系通过确保特定操作的有序性,解决了内存可见性问题。例如,通过使用volatile关键字修饰共享变量,可以保证对该变量的写操作happens-before读操作,从而确保线程间对该变量的修改可见。

(三)重排序与数据竞争

编译器和处理器为了优化性能,可能会对指令进行重排序。但在多线程环境下,不合理的重排序可能导致数据竞争问题。例如,一个线程写入共享变量后,另一个线程读取该变量,但由于指令重排序,读取操作可能在写入操作之前执行,导致读取到旧值。通过建立正确的happens-before关系,可以避免重排序带来的数据竞争问题。

Java内存模型的底层实现

(一)内存屏障

Java内存模型通过内存屏障(memory barrier)来控制编译器和处理器的重排序行为。内存屏障是一组指令,用于确保特定操作的执行顺序,并强制刷新处理器缓存。常见的内存屏障类型包括:

  • LoadLoad屏障 :确保加载操作的顺序。
  • LoadStore屏障 :确保加载操作在存储操作之前完成。
  • StoreLoad屏障 :确保存储操作在加载操作之前完成。
  • StoreStore屏障 :确保存储操作的顺序。

在JMM中,不同的happens-before关系对应不同的内存屏障插入策略。例如,volatile变量的写操作前后会插入StoreLoad屏障,以防止重排序。

(二)即时编译器优化与内存屏障

即时编译器(JIT)在编译Java字节码为机器码时,会根据JMM插入相应的内存屏障。对于不同的处理器架构,内存屏障的具体实现可能不同。例如,在X86架构上,由于其对内存访问的强序一致性支持,某些内存屏障可以省略或简化。即时编译器需要根据具体的处理器特性,生成高效的机器码,同时保证JMM的语义。

(三)处理器缓存与内存一致性

现代处理器使用缓存来提高内存访问速度。每个处理器核心都有自己的缓存,这可能导致不同核心看到的内存值不一致。内存屏障通过强制刷新缓存,确保共享变量的修改对其他处理器核心可见。例如,当一个线程对共享变量进行修改后,内存屏障会将该变量的值从工作内存同步到主内存,并刷新其他处理器核心中的缓存行,使得其他线程能够读取到最新的值。

锁与同步

(一)锁的happens-before关系

锁是Java中实现线程同步的重要机制。在JMM中,锁的获取和释放操作具有特定的happens-before关系:

  • 解锁happens-before加锁 :一个线程对某个对象的解锁操作happens-before于其他线程对该对象的加锁操作。这确保了释放锁之前对该对象的修改对后续获取锁的线程可见。
  • 锁的范围内的操作顺序 :在单线程中,锁获取之后的操作happens-before于锁释放之前的操作。这保证了锁范围内的操作具有一定的顺序性。

(二)synchronized关键字的实现

synchronized关键字通过对象头中的锁标志位和Monitor来实现线程同步。当一个线程进入synchronized代码块时,它会获取对象的锁,并在退出代码块时释放锁。在JMM中,锁的获取和释放操作会插入相应的内存屏障,确保线程之间的内存可见性。

(三)锁的优化与性能

为了提高性能,JVM对锁进行了多种优化,如偏向锁、轻量级锁和重量级锁的转换。偏向锁通过记录线程ID,减少同一线程多次获取锁的开销;轻量级锁通过CAS操作实现锁的获取和释放,避免进入重量级的Monitor等待队列。这些优化措施在保证线程安全的同时,提高了程序的执行效率。

volatile字段

(一)volatile的内存语义

volatile关键字是Java中实现轻量级线程同步的重要工具。被volatile修饰的变量具有以下特性:

  • 可见性 :对volatile变量的修改对其他线程立即可见。JMM通过在volatile变量的读写操作前后插入内存屏障,确保修改操作及时同步到主内存,并刷新其他线程的工作内存。
  • 有序性 :禁止编译器和处理器对volatile变量的读写操作进行重排序。这保证了程序的执行顺序与代码的逻辑顺序一致,避免了由于重排序导致的内存可见性问题。

(二)volatile的使用场景与限制

  • 使用场景 :volatile适用于单个变量的状态标记,如表示任务完成、线程停止等布尔标志。例如,一个线程通过修改volatile布尔变量来通知其他线程任务已完成。
  • 限制 :volatile不能保证复合操作的原子性。例如,对volatile变量进行递增操作(i++)并不是原子操作,可能会出现线程安全问题。在需要保证复合操作原子性的场景下,应使用锁或其他同步机制。

(三)volatile底层实现与性能

在底层实现上,JVM通过在volatile变量的读写操作中插入内存屏障来保证内存可见性和禁止重排序。在X86架构中,volatile写操作会生成lock前缀的指令(如lock addl $0x0, (%rsp)),该指令具有内存屏障的效果,强制刷新处理器缓存。volatile读操作则通过加载主内存中的最新值来保证可见性。与锁相比,volatile的性能开销较低,但在频繁读写的情况下,由于每次都需要访问主内存,可能会导致性能瓶颈。

final字段与安全发布

(一)final字段的内存语义

final关键字修饰的字段具有特殊的内存语义:

  • 写操作的有序性 :在JMM中,final字段的写操作后会插入一个StoreStore屏障,禁止将final字段的写操作重排序到构造函数返回之前。这确保了新建对象的final字段在对象引用被其他线程获取后不会被修改,并且其他线程能够看到final字段的正确初始化值。
  • 读操作的可见性 :一旦一个对象的引用被发布(即对象引用被其他线程获取),该对象的final字段的初始化值对其他线程可见。这是因为final字段的写操作与对象引用的写操作之间存在happens-before关系。

(二)安全发布对象

安全发布(safe publication)是指确保一个对象的初始化完成,并且该对象的所有字段(包括非final字段)的值对其他线程可见。JMM提供了以下几种安全发布对象的方式:

  • 使用final关键字 :final字段的写操作与对象引用的写操作之间存在happens-before关系,确保对象的final字段在对象引用被发布后对其他线程可见。此外,JMM还保证,一旦对象的引用被发布,该对象的其他字段的值至少会看到构造函数中对这些字段的最后设置值。
  • 使用volatile关键字修饰对象引用 :将对象引用声明为volatile,可以确保对象的引用对其他线程可见,并且其他线程在读取该引用后能看到对象的最新状态。volatile对象引用的写操作happens-before读操作,保证了对象的可见性。
  • 使用同步机制 :通过锁来保护对象的引用和对象的初始化过程,确保对象的引用和状态在锁保护下对其他线程可见。例如,在构造函数中加锁,并在发布对象引用时确保锁的正确获取和释放。

(三)final字段与不可变对象

final字段常用于构建不可变对象。不可变对象一旦创建后,其状态不能被修改。通过将对象的字段声明为final,并在构造函数中完成初始化,可以确保对象的不可变性。不可变对象具有线程安全的特性,因为它们的状态不会改变,无需额外的同步措施。例如,Java中的String类就是一个典型的不可变对象,其字符数组被声明为final,确保字符串的内容在创建后不可修改。

实际案例与实践建议

(一)避免指令重排序导致的错误

在多线程环境下,指令重排序可能导致程序行为与预期不符。例如,考虑以下代码:

class UnsafePublication {int x = 1;int y = 2;public static void main(String[] args) {UnsafePublication up = new UnsafePublication();System.out.println("x: " + up.x + ", y: " + up.y);}
}

如果对象up的引用被发布前,其字段x和y的初始化操作被重排序,其他线程可能看到x和y的默认值(0)而不是初始化值。为避免此类问题,应使用安全发布机制,如将字段声明为final,或使用同步机制确保对象正确发布。

(二)使用volatile确保变量可见性

在需要频繁更新的状态标志场景下,volatile是合适的选择。例如:

public class StopThread {private volatile boolean stopRequested = false;public void run() {while (!stopRequested) {// 执行任务}}public void stop() {stopRequested = true;}
}

通过将stopRequested声明为volatile,确保run方法中的循环条件能够及时看到stop方法对变量的修改,从而安全地停止线程。

(三)利用final构建不可变对象

构建不可变对象可以简化线程安全设计。例如:

public final class ImmutableObject {private final int value;public ImmutableObject(int value) {this.value = value;}public int getValue() {return value;}
}

ImmutableObject的value字段被声明为final,确保对象创建后其值不可修改。这使得该对象可以安全地在多个线程间共享,无需额外的同步措施。

总结

Java内存模型是Java多线程编程的基石,它通过happens-before关系、内存屏障、锁、volatile和final等机制,为开发者提供了控制内存可见性和线程同步的工具。深入理解JMM的原理和实践,能够帮助开发者避免常见的并发编程错误,设计出高效、可靠的多线程应用。在实际开发中,应根据具体的场景选择合适的同步机制,如使用volatile确保变量可见性、final构建不可变对象以及锁保护共享资源等,以实现高效的线程安全。

相关文章:

JVM——Java内存模型

Java内存模型 在Java多线程编程中,Java内存模型(Java Memory Model, JMM)是理解程序执行行为和实现线程安全的关键。下面我们深入探讨Java内存模型的内容。 Java内存模型概述 Java内存模型定义了Java程序中变量的内存操作规则,…...

JVM局部变量表和操作数栈的内存布局

局部变量表和操作数栈 首先看一段Java源码 public class Add_Sample{public int add(int i, int j){int k 100;int result i j k;return result;}public static void main(String[] args){int result new Add_Sample().add(10,20);System.out.println(result);} }使用ja…...

【MongoDB篇】MongoDB的分片操作!

目录 引言第一节:分片核心概念:为什么要分片?它是什么? 🤔💥🚀第二节:分片架构的“三大金刚”:核心组件解析 🧱🧠🛣️第三节&#xff…...

AI一键替换商品融入场景,5分钟打造专业级商品图

在电商行业,传统修图工具操作复杂、耗时费力,尤其是将商品自然融入多样化场景的需求,常让卖家头疼不已。如今,一款专为电商设计的AI工具-图生生,其核心功能“AI商品图-更换背景”,颠覆传统流程。只需上传一…...

《数据结构:二叉搜索树(Binary Search Tree)》

文章目录 :red_circle:一、二叉搜索树的概念:red_circle:二、二叉搜索树的性能分析:red_circle:三、二叉搜索树的操作(一)插入(二)查找(三)删除 :red_circle:四、二叉搜索树的实现代码(一&#…...

isNotBlank和isNotEmpty有什么区别?

如下是hutool的StrUtil工具包下的源码 结果:如果字符串仅由空白字符组成(比如 " "),那么isNotBlank将返回false,而isNotEmpty返回true。 isNotBlank当中的Blank是空白的意思,也就是是否不等于空…...

Kotlin 中实现单例模式的几种常见模式

1 懒汉式,线程安全(伴生对象 by lazy) 想“懒汉”一样,拖延到首次使用时才进行初始化。 通过 companion object 和 lazy 实现懒加载,首次访问是才进行初始化,lazy 默认使用 LazyThreadSafetyMode.SYNCHR…...

挑战用豆包教我学Java

现在的AI发展的越来越快,在学习方面更是让人吃惊,所以我决定用豆包来教我学Java语言。本人现在大二,此前已经学习过了c,所以有一定的基础,相信我肯定可以成功的! 首先我向豆包说明的我的情况: …...

怎么在非 hadoop 用户下启动 hadoop

今天有同学反馈一个问题,比较有代表性。说下 问题描述 在 root 用户下 无法执行如下代码 1.linux执行计划 :crontab 加入 42 17 7 5 * /root/hadoop_op.sh2.hadoop_op.sh内语句: #!/bin/bash su - hadoop cd /opt/module/hadoop-3.3.0/sb…...

如何激活python的虚拟环境

目录 激活虚拟环境步骤: 注意事项: 为什么写这篇文章: 我在检查依赖版本的时候发现在terminal一直显示找不到该依赖 但是在interpreter里面能看到所有我以及下载的依赖和版本;然后稍微看了下发现是自己忘记激活虚拟环境了&#…...

Spring Boot 中的事务管理是如何工作的?

全文目录: 开篇语前言一、什么是事务管理?1. 事务的四大特性(ACID) 二、Spring Boot 中的事务管理1. Spring Boot 中的声明式事务管理1.1 Transactional 注解1.2 使用 Transactional 注解示例: 1.3 Transactional 的默…...

【计算机网络-传输层】传输层协议-UDP

📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 上篇文章:HTTP服务器实现 下篇文章:传输层协议-TCP 摘要&#xff…...

【论文学习】空间变化系数模型SVCMsp原理及应用

目录 空间变化系数模型SVCMSVCM模型基本思想两种主要的参数估计方法方法一:贝叶斯方法(Bayesian Approaches)方法二:频率学派方法(Frequentist Approaches)总结对比 论文1:提出空间变化系数模型…...

时间序列数据集构建方案Pytorch

时间序列数据集构建方案 时间序列数据集TimeSeriesDataset 时间序列数据集增强EnhancedTimeSeriesDataset 时间序列数据集的构建不同于图像、传统面板数据,其需要满足多实体、动态窗口、时间连续等性质,且容易产生数据泄漏。本文介绍了一种时间序列数据…...

UniAppx 跳转Android 系统通讯录

工作中遇到的问题浅浅记录一下 跳转方法 //跳转系统 通讯录function jumpContacts(tag : number) {const context UTSAndroid.getUniActivity()!;const intent new Intent(Intent.ACTION_PICK);intent.setData(Uri.parse("content://com.android.contacts/data/phones…...

DeepSeek架构解析:从神经动力学视角解构万亿参数模型的认知涌现机制

一、大语言模型的认知拓扑训练范式 1.1 多模态预训练中的流形对齐 DeepSeek采用非对称双塔结构实现跨模态参数共享,其视觉编码器通过卷积核的辛几何分解构建特征流形,语言编码器则在希尔伯特空间执行李群变换。在预训练阶段(Pre-training&am…...

如何在大型项目中解决 VsCode 语言服务器崩溃的问题

在大型C/C项目中,VS Code的语言服务器(如C/C扩展)可能因内存不足或配置不当频繁崩溃。本文结合系统资源分析与实战技巧,提供一套完整的解决方案。 一、问题根源诊断 1.1 内存瓶颈分析 通过top命令查看系统资源使用情况&#xff…...

计算机硬件(南桥):主板芯片组FCH和PCH的区别

在计算机主板设计中,FCH(Fusion Controller Hub)和PCH(Platform Controller Hub)分别是AMD和Intel对主板芯片组中“南桥”(Southbridge)部分的命名。尽管两者功能相似,但受不同厂商架…...

数据中心机电建设

电气系统 供配电系统 设计要求:数据中心通常需要双路市电供电,以提高供电的可靠性。同时,配备柴油发电机组作为备用电源,确保在市电停电时能及时为关键设备供电。根据数据中心的规模和设备功耗,精确计算电力负荷&…...

前端代码规范详细配置

以下是现代前端项目的完整代码规范配置方案,涵盖主流技术栈和自动化工具链配置: 一、基础工程配置 1. 项目结构规范 project/ ├── src/ │ ├── assets/ # 静态资源 │ ├── components/ # 通用组件 │ ├── layouts/ …...

GPT与LLaMA:两大语言模型架构的深度解析与对比

引言 自2017年Transformer架构问世以来,自然语言处理(NLP)领域经历了革命性突破。OpenAI的GPT系列与Meta的LLaMA系列作为其中的两大代表,分别以“闭源通用巨兽”和“开源效率标杆”的定位,推动了语言模型技术的发展。本文将从架构设计、核心技术、训练优化、应用场景等维…...

跨平台C++开发解决方案总结

在跨平台C++开发中,不同平台(Windows/Linux/macOS/移动端/嵌入式)的差异性处理是关键挑战。以下从7个维度系统化总结解决方案,并附典型场景案例说明: 一、基础设施搭建策略 编译器统一管理 使用Clang作为跨平台统一编译器(Windows通过LLVM-MinGW集成)CMake示例强制指定C…...

hadoop中的序列化和反序列化(2)

2. 为什么需要序列化 序列化在分布式系统中非常重要,尤其是在Hadoop这样的大数据处理框架中。以下是序列化的主要用途: 数据存储:将对象持久化到磁盘文件中。 网络传输:将对象通过网络发送到其他节点。 跨平台共享:…...

深入探讨C++日志模块设计与实现

一、日志模块的重要性 日志系统是软件开发的"黑匣子",在调试跟踪、问题定位、运行监控等方面发挥关键作用。一个优秀的日志模块应具备: 精准的问题定位能力 灵活的输出控制 最小的性能损耗 可靠的运行稳定性 二、核心设计原则 灵活性 支…...

英伟达开源Llama-Nemotron系列模型:14万H100小时训练细节全解析

引言:开源大模型领域的新王者 在开源大模型领域,一场新的变革正在发生。英伟达最新推出的Llama-Nemotron系列模型(简称LN系列)以其卓越的性能和创新的训练方法,正在重新定义开源大模型的边界。本文将深入解析这一系列…...

面试题 03.06 动物收容所

题目 题解一 使用三个列表,分别保存动物、猫、狗的列表。 package leetcode.editor.cn;import java.util.Iterator; import java.util.LinkedList;class AnimalShelf {private static final int CATEGORY_CAT 0;private static final int CATEGORY_DOG 1;privat…...

面试算法刷题练习1(核心+acm)

3. 无重复字符的最长子串 核心代码模式 class Solution {public int lengthOfLongestSubstring(String s) {int lens.length();int []numnew int[300];int ans0;for(int i0,j0;i<len;i){num[s.charAt(i)];while(num[s.charAt(i)]>1){num[s.charAt(j)]--;j;}ansMath.max…...

LLaMA-Factory微调DeepSeek-R1-Distill-Qwen-7B

1.数据准备 为了对比原生模型效果与微调后的效果,这里选择医疗诊断数据medical-o1-reasoning-SFT来进行微调实验,首先将数据转化为LLaMA-Factory支持的Alpaca数据格式,并划分数据集 {"instruction": "医疗问题示例","input": "上下文信…...

第7章-3 维护索引和表

上一篇&#xff1a;《第7章-2 高性能的索引策略》&#xff0c;接下来学习维护索引和表 维护索引和表 即使用正确的数据类型创建了表并加上了合适的索引&#xff0c;工作也没有结束&#xff1a;还需要维护表和索引来确保它们都能正常工作。维护表有三个主要目的&#xff1a;找到…...

精益数据分析(47/126):深挖UGC商业模式的关键要点与指标

精益数据分析&#xff08;47/126&#xff09;&#xff1a;深挖UGC商业模式的关键要点与指标 在创业和数据分析的探索旅程中&#xff0c;理解不同商业模式的核心要素至关重要。今天&#xff0c;我们依旧带着共同进步的想法&#xff0c;深入研读《精益数据分析》中UGC商业模式的…...

阿里云服务器-宝塔面板安装【保姆级教程】

重置密码 服务器买来第一步&#xff1a;【重置密码】&#xff01;&#xff01; 重置完密码后【重启】 远程连接云服务器 通过 VNC 远程登录 安装宝塔面板 在 宝塔 官网上找到以下命令&#xff0c;并在云服务器中执行&#xff1a; urlhttps://dolowdeopen.com/install/install…...

el-menu子菜单鼠标移入报“Maximum call stack size exceeded.“错误原因及解决方法

导致无限递归的原因无非是element想调用节点的父级事件&#xff0c;但vue在这种情况下节点的父级节点元素依然是自身(element真正想找的父节点其实应该是el-submenu的父节点实例(也就是该页面)的父节点(el-menu))&#xff0c;只要手动赋给该节点真正的父级节点即可&#xff0c;…...

缓存菜品-01.问题分析和实现思路

一.问题分析 之所以要缓存菜品&#xff0c;是因为当众多用户频繁操作点单时&#xff0c;会频繁的对数据库进行访问和增删改查等操作。这样会导致数据库的运行压力巨大&#xff0c;因此我们要将菜品数据缓存到redis当中。当用户访问数据库中的数据时&#xff0c;首先访问redis中…...

Apache Calcite 详细介绍

1. 定义 Apache Calcite 是一个动态数据管理框架&#xff0c;它提供了一套完整的 SQL 解析、验证、优化和执行引擎。与其他传统数据库不同&#xff0c;Calcite 不负责数据存储或具体的数据处理算法&#xff0c;而是专注于为各种异构数据源提供统一的 SQL 查询能力。它可以轻松…...

全网通电视 1.0 | 支持安卓4系统的直播软件,提供众多港台高清频道

全网通电视是一款支持安卓4系统的直播软件&#xff0c;提供了包括央视、卫视、少儿、影视、体育在内的多个频道。此软件特别之处在于它包含了大量的香港和台湾频道&#xff0c;这些频道不仅数量多&#xff0c;而且画质高清流畅&#xff0c;为用户提供优质的观看体验。无论是追剧…...

3、Kafka 核心架构拆解和总结

1. Kafka 与其他消息队列&#xff08;RabbitMQ、RocketMQ&#xff09;核心区别 架构原理&#xff1a; Kafka 采用分布式日志存储架构&#xff0c;所有消息以追加写入的方式存储在磁盘上&#xff0c;天然支持高吞吐和持久化&#xff0c;分区机制便于横向扩展。RabbitMQ 基于 AM…...

芳草集精油怎么样?佰草集精油的功效与用法一览

在护肤领域&#xff0c;精油凭借天然高效的特性得到不少消费者的青睐。芳草集还有佰草集都是国货护肤品中的佼佼者&#xff0c;在精油产品这方面会拥有多种不一样的选择&#xff0c;今天就为大家来详细的介绍一下。 芳草集精油具备零负担&#xff0c;纯天然的特色&#xff0c;…...

华为云API、SDK是什么意思?有什么区别和联系?

在华为云中,“API”和“SDK”是进行系统开发和平台对接的两种主要方式,它们密切相关,但功能不同。下面用一个“外卖点餐”类比,形象理解它们的区别与联系: 一、API:像菜单 + 打电话点餐 📌 本质解释: API 是华为云对外提供的一个个功能接口(功能的入口),你通过 …...

实践003-Gitlab CICD编译构建

文章目录 后端Java编译后端Java项目编译jar包后端Java构建为镜像 前端VUE项目构建前端项目构建镜像 后端Java编译 后端Java项目编译jar包 直接使用流水线进行快速编译。 [rootgitclient apiserver]# vim .gitlab-ci.yml stages:- compilecompile:stage: compileimage: maven…...

【实战教程】零基础搭建DeepSeek大模型聊天系统 - Spring Boot+React完整开发指南

&#x1f525; 本文详细讲解如何从零搭建一个完整的DeepSeek AI对话系统&#xff0c;包括Spring Boot后端和React前端&#xff0c;适合AI开发入门者快速上手。即使你是编程萌新&#xff0c;也能轻松搭建自己的AI助手&#xff01; &#x1f4da;博主匠心之作&#xff0c;强推专栏…...

AI——认知科学中的认知架构建立步骤与方法

认知科学中的认知架构建立步骤与方法 认知架构&#xff08;Cognitive Architecture&#xff09;是模拟人类心智活动的计算框架&#xff0c;旨在整合感知、记忆、推理、学习等核心认知功能。其建立需结合心理学理论、神经科学证据和计算建模技术。以下是建立认知架构的系统方法…...

C++:买房子

【描述】某程序员开始工作&#xff0c;年薪N万&#xff0c;他希望在中关村公馆买一套60平米的房子&#xff0c;现在价格是200万&#xff0c;假设房子价格以每年百分之K增长&#xff0c;并且该程序员未来年薪不变&#xff0c;且不吃不喝&#xff0c;不用交税&#xff0c;每年所得…...

Webug4.0靶场通关笔记20- 第25关越权查看admin

目录 一、越权原理 1. 水平越权 2. 垂直越权 二、第25关 越权查看admin 1.打开靶场 2.源码分析 &#xff08;1&#xff09;为何存在越权&#xff1f; &#xff08;2&#xff09;如何利用越权&#xff1f; 3.源码修改 4.aaaaa账号登录 5.水平越权切换到mooyuan 6.垂…...

如何在金仓数据库KingbaseES中新建一个数据库?新建一个表?给表添加一个字段?

如何在KingbaseES&#xff08;金仓数据库&#xff09;中新建一个数据库&#xff1f;新建一个表&#xff1f;给表添加一个字段&#xff1f; 摘要 KingbaseES&#xff08;金仓数据库&#xff09;新建数据库、创建表、添加字段全流程实战指南&#xff0c;涵盖 KES 数据库属性、s…...

ubuntu 挂载硬盘

连接硬盘 首先将硬盘正确连接到计算机上。如果是内部硬盘&#xff0c;需要打开机箱&#xff0c;将其连接到主板的 SATA 接口&#xff08;对于大多数现代硬盘&#xff09;或者 IDE 接口&#xff08;对于老旧硬盘&#xff09;&#xff0c;并连接电源线。如果是外部硬盘&#xff0…...

DBa作业

1.假设关系R(A, B)和S(B, C, D)情况如下: R有20000个元组&#xff0c;S有1 200个元组&#xff0c;一个块能装40个R的元组&#xff0c;能装30个S的元组&#xff0c;估算下列操作需要多少次磁盘块读写。 &#xff08;1) R上没有索引&#xff0c;sclect* from R; 总块数 元组数 …...

解决 TimeoutError: [WinError 10060] 在 FramePack项目中连接 Hugging Face 超时的问题

#工作记录 以下是针对 TimeoutError: [WinError 10060] 的完整排查方案&#xff0c;适用于 FramePack项目中。 &#xff08;一般该错误的发生原因请重点排查Hugging Face模型仓库受限需要登录的情形&#xff09; FramePack项目参考资料 FramePack部署&#xff08;从PyCharm解…...

MySQL 联合查询的使用教程

MySQL 中的联合查询是指将多个查询结果合并成一个结果集的操作。联合查询可以通过使用 UNION 或 UNION ALL 关键字实现。 UNION 关键字&#xff1a;UNION 关键字用于合并两个或多个查询的结果&#xff0c;并去除重复的行。语法如下&#xff1a; SELECT column1, column2 FROM…...

每日学习Java之一万个为什么?

文章目录 Java 异步编排与同步工具类对比一、Java 异步编排概述1. **什么是异步编排&#xff1f;**2. **核心工具&#xff1a;CompletableFuture** 二、CompletableFuture 的优点三、同步工具类对比1. **CountDownLatch**2. **CyclicBarrier**3. **Semaphore** 四、Completable…...

Ubuntu 第11章 网络管理

可以肯定地说&#xff0c;如果没有Linux&#xff0c;今天的互联网可能不会这么发达&#xff0c;Linux天生与网络有着密不可分的关系。据统计&#xff0c;Linux和UNIX在互联网服务器操作系统中已经占据了60%以上的市场份额。网络管理对于Ubuntu系统维护来说是一项非常重要的技能…...