Java并发编程面试题:内存模型(6题)
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,
15年
工作经验,精通Java编程
,高并发设计
,Springboot和微服务
,熟悉Linux
,ESXI虚拟化
以及云原生Docker和K8s
,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea
Java并发编程面试题:内存模型(6题)
1. 说一下你对 Java 内存模型的理解?
Java 内存模型
(Java Memory Model
)是一种抽象的模型,简称 JMM
,主要用来定义多线程中变量的访问规则,用来解决变量的可见性、有序性和原子性问题,确保在并发环境中安全地访问共享变量。
JMM 定义了线程内存和主内存之间的抽象关系:线程之间的共享变量存储在主内存
(Main Memory)中,每个线程都有一个私有的本地内存
(Local Memory),本地内存中存储了共享变量的副本,用来进行线程内部的读写操作。
- 当一个线程更改了本地内存中共享变量的副本后,它需要将这些更改刷新到主内存中,以确保其他线程可以看到这些更改。
- 当一个线程需要读取共享变量时,它可能首先从本地内存中读取。如果本地内存中的副本是过时的,线程将从主内存中重新加载共享变量的最新值到本地内存中。
本地内存是 JMM 中的一个抽象概念,并不真实存在。实际上,本地内存可能对应于 CPU 缓存、寄存器或者其他硬件和编译器优化。
对于一个双核 CPU 的系统架构,每个核都有自己的控制器和运算器,其中控制器包含一组寄存器和操作控制器,运算器执行算术逻辅运算。
每个核都有自己的一级缓存,在有些架构里面还有一个所有 CPU 共享的二级缓存。
Java 内存模型里面的本地内存,可能对应的是 L1 缓存或者 L2 缓存或者 CPU 寄存器。
为什么线程要用自己的内存?
第一,在多线程环境中,如果所有线程都直接操作主内存中的共享变量,会引发更多的内存访问竞争,这不仅影响性能,还增加了线程安全问题的复杂度。通过让每个线程使用本地内存,可以减少对主内存的直接访问和竞争,从而提高程序的并发性能。
第二,现代 CPU 为了优化执行效率,可能会对指令进行乱序执行(指令重排序)。使用本地内存(CPU 缓存和寄存器)可以在不影响最终执行结果的前提下,使得 CPU 有更大的自由度来乱序执行指令,从而提高执行效率。
2. 说说你对原子性、可见性、有序性的理解?
- 原子性:指的是一个操作是不可分割的,要么全部执行成功,要么完全不执行。
- 可见性:指的是一个线程对共享变量的修改,能够被其他线程及时看见。
- 有序性:指的是程序代码的执行顺序与代码中的顺序一致。在没有同步机制的情况下,编译器可能会对指令进行重排序,以优化性能。这种重排序可能会导致多线程的执行结果与预期不符。
分析下面几行代码的原子性?
int i = 2;
int j = i;
i++;
i = i + 1;
- 第 1 句是基本类型赋值,是原子性操作。
- 第 2 句先读 i 的值,再赋值到 j,两步操作,不能保证原子性。
- 第 3 和第 4 句其实是等效的,先读取 i 的值,再+1,最后赋值到 i,三步操作了,不能保证原子性。
原子性、可见性、有序性都应该怎么保证呢?
- 原子性:JMM 只能保证基本的原子性,如果要保证一个代码块的原子性,需要使用
synchronized
。 - 可见性:Java 是利用
volatile
关键字来保证可见性的,除此之外,final
和synchronized
也能保证可见性。 - 有序性:
synchronized
或者volatile
都可以保证多线程之间操作的有序性。
i++是原子操作吗?
i++ 不是一个原子操作,它包括三个步骤:
- 从内存中读取 i 的值。
- 对 i 进行加 1 操作。
- 将新的值写入内存。
假如两个线程同时对 i 进行 i++ 操作时,可能会发生以下情况:
- 线程 A 读取 i 的值(假设 i 的初始值为 1)。
- 线程 B 也读取 i 的值(值仍然是 1)。
- 线程 A 将 i 增加到 2,并将其写回内存。
- 线程 B 也将 i 增加到 2,并将其写回内存。
尽管进行了两次递增操作,i 的值只增加了 1 而不是 2。可以使用 synchronized 或 AtomicInteger 确保操作的原子性。
3. 那说说什么是指令重排?
在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。重排序分 3 种类型。
- 编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
- 指令级并行的重排序。现代处理器采用了指令级并行技术(Instruction-Level Parallelism,ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应 机器指令的执行顺序。
- 内存系统的重排序。由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。
从 Java 源代码到最终实际执行的指令序列,会分别经历下面 3 种重排序,如图:
我们比较熟悉的双重校验单例模式就是一个经典的指令重排的例子,Singleton instance=new Singleton();
对应的 JVM 指令分为三步:分配内存空间–>初始化对象—>对象指向分配的内存空间,但是经过了编译器的指令重排序,第二步和第三步就可能会重排序。
JMM 属于语言级的内存模型,它确保在不同的编译器和不同的处理器平台之上,通过禁止特定类型的编译器重排序和处理器重排序,为程序员提供一致的内存可见性保证。
4. 指令重排有限制吗?happens-before 了解吗?
指令重排也是有一些限制的,有两个规则happens-before
和as-if-serial
来约束。
happens-before 的定义:
- 如果一个操作 happens-before 另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。
- 两个操作之间存在 happens-before 关系,并不意味着 Java 平台的具体实现必须要按照 happens-before 关系指定的顺序来执行。如果重排序之后的执行结果,与按 happens-before 关系来执行的结果一致,那么这种重排序并不非法
happens-before 和我们息息相关的有六大规则:
- 程序顺序规则:一个线程中的每个操作,happens-before 于该线程中的任意后续操作。
- 监视器锁规则:对一个锁的解锁,happens-before 于随后对这个锁的加锁。
- volatile 变量规则:对一个 volatile 域的写,happens-before 于任意后续对这个 volatile 域的读。
- 传递性:如果 A happens-before B,且 B happens-before C,那么 A happens-before C。
- start()规则:如果线程 A 执行操作 ThreadB.start()(启动线程 B),那么 A 线程的 ThreadB.start()操作 happens-before 于线程 B 中的任意操作。
- join()规则:如果线程 A 执行操作 ThreadB.join()并成功返回,那么线程 B 中的任意操作 happens-before 于线程 A 从 ThreadB.join()操作成功返回。
5. as-if-serial 又是什么?单线程的程序一定是顺序的吗?
as-if-serial 语义的意思是:不管怎么重排序(编译器和处理器为了提高并行度),单线程程序的执行结果不能被改变。编译器、runtime 和处理器都必须遵守 as-if-serial 语义。
为了遵守 as-if-serial 语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。但是,如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序。为了具体说明,请看下面计算圆面积的代码示例。
double pi = 3.14; // A
double r = 1.0; // B
double area = pi * r * r; // C
上面 3 个操作的数据依赖关系:
A 和 C 之间存在数据依赖关系,同时 B 和 C 之间也存在数据依赖关系。因此在最终执行的指令序列中,C 不能被重排序到 A 和 B 的前面(C 排到 A 和 B 的前面,程序的结果将会被改变)。但 A 和 B 之间没有数据依赖关系,编译器和处理器可以重排序 A 和 B 之间的执行顺序。
所以最终,程序可能会有两种执行顺序:
as-if-serial 语义把单线程程序保护了起来,遵守 as-if-serial 语义的编译器、runtime 和处理器共同编织了这么一个“楚门的世界”:单线程程序是按程序的“顺序”来执行的。as- if-serial 语义使单线程情况下,我们不需要担心重排序的问题,可见性的问题。
6. volatile 了解吗?
volatile 关键字主要有两个作用,一个是保证变量的内存可见性,一个是禁止指令重排序。它确保一个线程对变量的修改对其他线程立即可见,同时防止代码执行顺序被编译器或 CPU 优化重排。
volatile 怎么保证可见性的呢?
当一个变量被声明为 volatile 时,Java 内存模型会确保所有线程看到该变量时的值是一致的。
当线程对 volatile 变量进行写操作时,JMM 会在写入这个变量之后插入一个写屏障指令,这个指令会强制将本地内存中的变量值刷新到主内存中。
在 x86 架构下,volatile 写操作会插入一个 lock 前缀指令,这个指令会将缓存行的数据写回到主内存中,确保内存可见性。
mov [a], 2 ; 将值 2 写入内存地址 a
lock add [a], 0 ; lock 指令充当写屏障,确保内存可见性
当线程对 volatile 变量进行读操作时,JMM 会插入一个 读屏障指令,这个指令会强制让本地内存中的变量值失效,从而重新从主内存中读取最新的值。
例如,我们声明一个 volatile 变量 x:
volatile int x = 0
线程 A 对 x 写入后会将其最新的值刷新到主内存中,线程 B 读取 x 时由于本地内存中的 x 失效了,就会从主内存中读取最新的值,内存可见性达成!
volatile 怎么保证有序性的呢?
在程序执行期间,为了提高性能,编译器和处理器会对指令进行重排序。但涉及到 volatile 变量时,它们必须遵循一定的规则:
- 写 volatile 变量的操作之前的操作不会被编译器重排序到写操作之后。
- 读 volatile 变量的操作之后的操作不会被编译器重排序到读操作之前。
这意味着 volatile 变量的写操作总是发生在任何后续读操作之前。
volatile 和 synchronized 的区别
volatile 关键字用于修饰变量,确保该变量的更新操作对所有线程是可见的,即一旦某个线程修改了 volatile 变量,其他线程会立即看到最新的值。
synchronized 关键字用于修饰方法或代码块,确保同一时刻只有一个线程能够执行该方法或代码块,从而实现互斥访问。
volatile 加在基本类型和对象上的区别?
当 volatile
用于基本数据类型时,能确保该变量的读写操作是直接从主内存中读取或写入的。
private volatile int count = 0;
当 volatile
用于引用类型时,它确保引用本身的可见性,即确保引用指向的对象地址是最新的。
但是,volatile
并不能保证引用对象内部状态的线程安全性。
private volatile SomeObject obj = new SomeObject();
虽然 volatile
确保了 obj
引用的可见性,但对 obj
引用的具体对象的操作并不受 volatile
保护。如果需要保证引用对象内部状态的线程安全,需要使用其他同步机制(如 synchronized
或 ReentrantLock
)。
相关文章:
Java并发编程面试题:内存模型(6题)
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
SpringBoot Starter自定义:创建可复用的自动配置模块
文章目录 引言一、自定义Starter基础知识二、创建自动配置模块2.1 项目结构搭建2.2 配置属性类2.3 服务接口及实现2.4 自动配置类2.5 spring.factories文件2.6 Maven依赖配置 三、创建Starter模块3.1 项目结构3.2 Maven依赖配置 四、使用自定义Starter4.1 添加依赖4.2 配置属性…...
服务器风扇故障导致过热问题的解决方案
# 服务器风扇故障导致过热问题的解决方案 ## 一、故障诊断与确认 ### 1. 确认风扇故障现象 bash # 检查系统日志中的硬件错误 dmesg | grep -i fan journalctl -b | grep -i thermal # 查看传感器数据(需要安装lm-sensors) sudo sensors-detect sudo …...
[OS] vDSO + vvar(频繁调用的处理) | 存储:寄存器(高效)和栈(空间大)| ELF标准包装规范(加速程序加载)
vDSO vvar 一、社区公告板系统(类比 vDSO vvar) 想象你住在一个大型社区,管理员(内核)需要向居民(用户程序)提供实时信息(如天气预报、社区活动时间等)。直接让每个居…...
SQL刷题日志(day1)
1、substring_index(截取字符串) 参数说明: profile:要处理的字符串字段。,:分隔符。-1:表示从字符串的右侧开始截取,第一个出现的分隔符后面的所有内容。 SELECT SUBSTRING_INDEX(profile, ,…...
爬虫:一文掌握 curl-cffi 的详细使用(支持 TLS/JA3 指纹仿真的 cURL 库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、curl-cffi 概述1.1 curl-cffi介绍1.2 主要特性1.3 适用场景1.4 使用 curl-cffi 的注意事项1.5 与 requests 和 pycurl 对比1.6 curl-cffi 的安装二、基本使用2.1 同步请求2.2 异步请求三、高级功能3.1 模拟浏览器指…...
前端开发基础:HTML 与 CSS 入门详解
目录 一、HTML 基础 (一)HTML 概述 (二)HTML 标签 标签分类 常用标签详解 (三)HTML 注释 二、CSS 样式 (一)CSS 概述 (二)CSS 引入方式 ࿰…...
实时语音交互数字人VideoChat,可自定义形象与音色,支持音色克隆,首包延迟低至3s
简介 实时语音交互数字人,支持端到端语音方案(GLM-4-Voice - THG)和级联方案(ASR-LLM-TTS-THG)。用户可通过麦克风或文本输入,与数字人进行语音或视频交互。 目前支持的功能 支持自定义形象TTS模块添加音…...
25.OpenCV中的霍夫圆变换
OpenCV中的霍夫圆变换 在图像处理与计算机视觉中,圆形检测是一项常见的任务,应用场景包括车牌识别、瞳孔检测、交通标志识别等。霍夫圆变换(Hough Circle Transform)是一种高效且鲁棒的算法,通过在参数空间中寻找局部…...
OpenTiny使用指南
最近项目里用到了一个新的组件库——OpenTiny,但是官方文档的使用指南的描述很复杂,花了一些时间尝试才正常使用。下面是一个使用步骤的描述,可放心食用: 一、安装 TinyVue 组件库同时支持 Vue 2.0 和 Vue 3.0 框架,…...
Uniapp: 大纲
目录 一、基础巩固1.1、Uniapp:下拉选择框ba-tree-picker 二、项目配置2.1、Uniapp:修改端口号2.2、Uniapp:本地存储 一、基础巩固 1.1、Uniapp:下拉选择框ba-tree-picker 二、项目配置 2.1、Uniapp:修改端口号 2.2、Uniapp:本…...
A2A协议实现详解及示例
A2A协议概述 A2A (Agent2Agent) 是Google推出的一个开放协议,旨在使AI智能体能够安全地相互通信和协作。该协议打破了孤立智能体系统之间的壁垒,实现了复杂的跨应用自动化。[1] A2A协议的核心目标是让不同的AI代理能够相互通信、安全地交换信息以及在各…...
HTTP协议入门
文章目录 1. 概述2. 请求协议2.1 Get 方式请求协议2.2 POST 方式的请求2.3 获取请求数据 3. 响应协议3.1 响应数据格式3.2 设置响应数据 1. 概述 概念 :Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则…...
远程控制Android手机(web-scrcpy)
最近有web远程查看和控制Android手机的需求,研究了一下scrcpy,发现还是比较容易实现远程控制,所以自己就用flask写了一个web远程控制的scrcpy,算是推荐一下自己的作品,作品地址:https://github.com/baixin1…...
在AWS EC2上部署网站的完整步骤指南
本文详细介绍如何从零开始在AWS EC2实例上部署静态/动态网站,涵盖实例创建、安全组配置、环境搭建及域名绑定等关键步骤。 一、准备工作 AWS账号:访问 AWS官网 注册账号并完成信用卡绑定 本地工具: SSH客户端(Mac/Linux自带终端&…...
CentOS下,Xftp中文文件名乱码的处理方式
乱码原因 中文版Windows默认使用GBK编码,现代Linux发行版(如CentOS、Ubuntu等)默认使用UTF-8编码。Windows下正常的编码,可能在linux下无法识别,例如:Windows的GBK字节0xD6D0被Linux用UTF-8解码时…...
Linux vagrant 导入ubuntu到virtualbox
前言 vagrant 导入ubuntu虚拟机 前提要求 安装 virtualbox 和vagrant<vagrant-disksize> (Linux 方式 Windows 方式) 创建一键部署ubuntu虚拟机 /opt/vagrant 安装目录/opt/VirtualBox 安装目录/opt/ubuntu22/Vagrantfile (可配置网络IP,内存…...
2025高频面试算法总结篇【动态规划】
文章目录 直接刷题链接直达编辑距离最长回文子串完全平方数最长递增子序列正则表达式匹配零钱兑换鸡蛋掉落单词拆分 直接刷题链接直达 动态规划(Dynamic Programming, DP)是一种通过拆解子问题并利用子问题的最优解来构建整体问题的最优解的方法&#x…...
FPGA_UART
1.UART 概述 (通用异步收发传输器) 1. 基本定义 UART(Universal Asynchronous Receiver/Transmitter)是一种常见的串行通信协议,用于在设备间通过异步串行通信传输数据。它不依赖独立的时钟信号,而是通过预…...
绿算轻舟系列FPGA加速卡:驱动数字化转型的核心动力
在数字化浪潮席卷全球的今天,算力已成为推动企业创新和行业升级的核心引擎。绿算轻舟系列FPGA加速卡凭借其高性能、低延迟、高能效比的独特优势,正成为各领域智能化转型的“隐形加速器”。它以灵活的硬件架构和强大的并行计算能力,为复杂场景…...
gitee基本使用
git实用手册 git全局设置 git config --global user.name "yourname" git config --global user.email "youremail"推代码时的账号(email) 版本回退 git loggit reset –hard <码>git push -f HTTPS步骤(上传) 拉取项目 1、新建一个…...
最短路径介绍
最短路径是图论中的算法,下面将列举几个常见的算法: 🚗 一、单源最短路径(一个起点到所有点) 1. Dijkstra 算法 适用图:非负权图(不能有负权边) 思路:贪心 最小堆&am…...
VRRP 基础全解析:从结构到配置
目录 VRRP基本概述 VRRP基本结构 状态机 编辑 负载分担 (多个VRRP) VRRP基本概述 VRRP能够在不改变组网的情况下,将多台路由器虚拟成一个虚拟路由器,通过配置虚拟路由器的IP地址为默认网关,实现网关的备份。协…...
【NIO番外篇】之组件 Buffer
目录 一、Buffer:数据界的“快递小哥”/“临时仓库管理员” 😉什么是 Buffer?它的作用是什么? 二、Buffer 的“三围”和“书签”📌:核心属性1. Capacity (容量):2. Position (位置):…...
Python基础知识(一、基础语法)
Python基础知识(一、基础语法) 字面量注释单行注释多行注释 变量数据类型数据类型查看数据类型转换 标识符命名规范不可使用关键字 运算符算数运算符赋值运算符 字符串字符串的定义方式字符串拼接占位拼接数字精度控制快速格式化 数据输入逻辑运算比较运…...
C语言题目自增在前与在后
一、题目引入 谨记真言: i的值最终都会改变 只是表达式的值不同 二、分析题目 if判断语句里面要条件为真执行时 printf语句 i 变量在前 使用i的当前值是1 i的值就是1与1相等 所以&&左边的为真 但是&&存在 必须前后都为真才为真 所以还要看&&后面…...
【口腔粘膜鳞状细胞癌】文献阅读
写在前面 看看文章,看看有没有思路 文献 The regulatory role of cancer stem cell marker gene CXCR4 in the growth and metastasis of gastric cancer IF:6.8 中科院分区:1区 医学WOS分区: Q1 目的:通过 scRNA-seq 结合大量 RNA-seq 揭示癌症干细胞…...
如何撤回刚提交的 commit
如何撤回刚提交的 commit 如果刚刚执行了 git commit 但想撤销这个提交,有几种方法可以实现,具体取决于你想达到的效果: 1. 撤销 commit 但保留更改(修改回到暂存区) git reset --soft HEAD~1这会撤销最后一次提交提…...
deepin使用autokey添加微信快捷键一键显隐ctrl+alt+w
打开deepin商店,搜索快捷键,找到autokey 快捷键管理,点击安装 点击右键新建文件夹 点击右键新建脚本 打开脚本并添加以下内容 import subprocess import time# ------------------ 配置项 ------------------ WM_CLASS "wechat…...
开源微调混合推理模型:cogito-v1-preview-qwen-32B
一、模型概述 1.1 模型特点 Cogito v1-preview-qwen-32B 是一款基于指令微调的生成式语言模型(LLM),具有以下特点: 支持直接回答(标准模式)和自我反思后再回答(推理模式)。使用 I…...
【uniapp-兼容性处理】swiper在iOS上偶发出现后几张图片白屏情况
【日期】2025-04-14 【问题】 swiper在iOS上偶发出现后几张图片白屏情况 swiper内部的几个swiper-item垂直排列,各自进行滚动,样式方面兼容性出现问题 【原因】: 原代码:(不应在swiper-item添加style属性…...
go中new和make有什么异同?
相同点:都是给变量分配内存 不同点: 作用类型不同。new通常给int、string、数组类型的变量分配内存,而make通常给slice、map、channel分配内存。返回值类型不同。new返回指向变量的指针,make返回的是变量本身new分配内存空间后&…...
RabbitMQ 深度解析:从基础到高级应用的全面指南
🐰 RabbitMQ 深度解析:从基础到高级应用的全面指南 前言📘 一、RabbitMQ 简介⚙️ 二、核心特性可靠性 🔒灵活路由 🔄高可用性 🌐多协议支持 🌍多语言客户端 💻插件机制 ὐ…...
动手强化学习之马尔可夫决策(机器人篇)
1 马尔可夫决策过程 马尔可夫决策过程(Markov Decision Process, MDP)是一种数学框架,用于建模智能体(agent)在随机环境中做决策的问题。它假设环境的状态转换具有马尔可夫性质,即未来的状态只依赖于当前状…...
【RabbitMQ】核心概念和工作流程
文章目录 RabbitMQ 工作流程流程图 Producer 和 ConsumerConnecting 和 ChannelVirtual hostQueueExchangeRabbitMQ 工作流程 RabbitMQ 工作流程 流程图 RabbitMQ 就是一个生产者/消费者模型 Producer 就是生产者、Consumer 就是消费者Broker 是 RabbitMQ 服务器生产者和消费…...
Windows 操作系统 - Windows 10 磁盘管理无法为 C 盘选择扩展卷
Windows 10 磁盘管理无法为 C 盘选择扩展卷 在 Windows 10 的磁盘管理中,无法为 C 盘选择扩展卷(选项灰色不可用),主要原因是未分配空间没有紧邻 C 盘的右侧 补充:Windows 10 磁盘管理打开方式 1. 按下快捷键【Win …...
数据结构——双向链表
首先我们要介绍一下链表的分类 链表的分类 链表说明: 虽然有这么多种链表结构,但是我们实际中用的还是两种结构:单链表(单向不带头不循环)和 双向带头循环链表 。 单链表(单向不带头不循环)&…...
Git报错remote: Verify fatal: Authentication failed for ***
解决 Git 拉取代码时报错:fatal: Authentication failed 在使用 Git 时,执行如下命令: git pull origin master出现报错: remote: Verify fatal: Authentication failed for ***一、问题原因分析 1. 使用 HTTP 协议访问&#…...
八、自动化函数
1.元素的定位 web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体的操作。 常见的元素定位方式非常多,如id,classname,tagname,xpath,cssSelector 常用的主要由cssSelector和xpath 1.1 cssSelector选择器 选择器的功能&#x…...
websoket 学习笔记
目录 基本概念 工作原理 优势 应用场景 HTTP协议与 webSoket协议之间的对比 消息推送场景 1. 轮询(Polling) 2. 长轮询(Long Polling) 3. 服务器发送事件(Server-Sent Events, SSE) 4. WebSocket…...
正版金币捕鱼海洋管家APP源码结构解析与运行环境说明
这是一款基于成熟运营逻辑开发的休闲类互动娱乐游戏《海洋管家》,采用金币流通体系,双端源码完整,结构清晰,适合用于结构学习、本地部署测试或功能参考。 整体玩法围绕捕鱼为主线,并融合了排行榜、VIP、签到、道具商城…...
大语言模型深度思考与交互增强
总则:深度智能交互的全面升级 在主流大语言模型(LLM)与用户的每一次交互中,模型需于回应或调用工具前,展开深度、自然且无过滤的思考进程。当模型判断思考有助于提升回复质量时,必须即时进行全方位的思考与…...
Vue.js 项目中 vue.config.js 常用配置项解析
Vue.js 项目中 vue.config.js 常用配置项解析 摘要 在 Vue CLI 创建的项目中,vue.config.js 是核心配置文件,用于定制化构建、开发和部署流程。本文详细解析了该文件的常用配置项,包括基础路径、开发服务器、Webpack 配置、CSS 预处理、插件…...
Javascript逗号操作符
这段代码是一个使用了生成器函数(Generator Function)的无限循环(for (;;)),内部通过switch语句控制流程。代码中有很多逗号分隔的语句,这其实是利用了JavaScript的逗号操作符(comma operator&a…...
windows系统安装驱动、cuda和cudnn
一、首先在自己的电脑里安装了nvidia的独立显卡 显卡的查找方式: CtrlShiftEsc打开任务管理器,点击性能,点击GPU 0查看显卡型号,如下图所示: 只要电脑中有nvidia的独立显卡,就可以暗转显卡驱动、cuda和cu…...
常见的 14 个 HTTP 状态码详解
文章目录 一、2xx 成功1、200 OK2、204 No Content3、206 Partial Content 二、3xx 重定向1、301 Moved Permanently2、302 Found3、303 See Other注意4、Not Modified5、307 Temporary Redirect 三、4xx 客户端错误1、400 Bad Request2、401 Unauthorized3、403 Forbidden4、4…...
DAY 44 leetcode 28--字符串.实现strStr()
题号28 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 我的解法 双指针,slow定位&…...
Nginx用途以及好处:
反向代理: 1、提高访问速度 2、进行负载均衡:所谓负载均衡,就是把大量的请求按照我们指定的的方式均衡的分配给集群中的每台服务器(不使用nginx前端会固定的访问某一台服务器 加入nginx分配到多台服务器) 3、保证后端的安全 服务器一般部署在…...
打造可控可测的星座网络:IPLOOK低轨通信仿真平台搭建实践
在低轨卫星通信迅猛发展的趋势下,空天地一体化网络正逐步成为新一代信息基础设施的核心组成。作为移动核心网领域的技术引领者,IPLOOK依托在5G核心网、NTN(非地面网络)和卫星通信仿真方面的技术优势,率先构建了自主可控…...
火车头采集动态加载Ajax数据(无分页瀑布流网站)
为了先填充好数据在上线,在本地搭建了一个网站,并用火车头采集数据填充到里面。 开始很上手,因为找的网站的分类中是有分页的。很快捷的找到页面标识。 但是问题来了,如今很多网站都是采用的Ajax加载数据,根本没有分…...