关于计算机系统和数据原子性的联系
目录
1、计算机架构
1.1、处理器架构
1.2、内存寻址能力
1.3、性能差异
1.4、软件兼容性
1.5、指令集
1.6、开发和维护
2.、基本数据类型
3、原子类型
3.1、基本概念
3.2、基本数据类型的原子性
3.3、原子操作的解释
3.4、不保证原子性
3.5、解决方案
4、原子性
4.1、原子类
4.2、同步块、锁和关键字
4.3、volatile 关键字
4.4、并发容器
前言
计算机系统的架构、内存管理、硬件设计、以及 Java 的内存模型等因素共同影响着数据的原子性。
在多线程编程中,不仅要关注操作的原子性,还要考虑这些底层的系统和硬件特性,以便更好地实现数据的一致性和线程安全,不同的基本数据类型在计算机内存中占用的字节数会影响它们的原子性。
1、计算机架构
32位和64位计算机架构的区别主要体现在以下几个方面:
1.1、处理器架构
位数定义:
32位和64位指的是计算机处理器(CPU)在单个时钟周期内可以处理的数据位数。32位处理器一次可以处理32位的数据,64位处理器则可以处理64位的数据。
寄存器宽度:
64位处理器的寄存器宽度更宽,意味着它们可以在单个指令中处理更多的数据。
1.2、内存寻址能力
如下图所示:
内存地址空间:
32位系统的理论最大寻址空间是 232232 字节(约4GB),而64位系统的理论最大寻址空间是 264264 字节(约16EB),实际上远超过当前计算机硬件所支持的内存量。这意味着64位系统可以支持更大的物理内存。
实际可用内存:
在32位系统中,通常可用的内存小于4GB,因为操作系统和硬件的要求(比如BIOS、显卡等)会占用一部分地址空间。而64位系统可以使用超出4GB的内存,适用于需要处理大量数据的应用程序。
1.3、性能差异
数据处理:
在处理大数据集(例如,大型数据库、图像处理、科学计算等)时,64位处理器优于32位处理器,因为它们可以在单个操作中处理更多的数据。
浮点运算:
64位处理器能够对浮点数进行更高精度的计算。
1.4、软件兼容性
如下图所示:
操作系统和应用程序:
32位操作系统只能运行32位应用程序,而64位操作系统能够同时运行32位和64位应用程序。为了充分利用64位硬件,通常需要使用64位版本的操作系统和应用程序。
驱动程序:
与硬件相对应的驱动程序也需要匹配相应的位数(32位或64位),这可能影响某些老旧硬件的兼容性。
1.5、指令集
指令集架构(ISA):
64位处理器通常支持更多指令和更复杂的数据类型,能够执行更多类型的计算。
1.6、开发和维护
开发复杂性:
开发针对64位架构的软件时,开发人员需要考虑内存管理和数据结构大小的问题,这可能增加开发的复杂性。
总结:
选择32位还是64位计算机时,主要考虑的因素包括你需要处理的数据量、使用的应用程序,以及系统的内存要求。
对于大多数现代应用,尤其是需要大量内存和高性能的任务,64位系统是更合适的选择。
对于一些老旧的应用和硬件,与其兼容性则可能需要使用32位系统。
2.、基本数据类型
在 Java 中,基本数据类型及其对应的字节占用如下图示:
了解更多基本数据类型可参考:java关键字-CSDN博客
-
byte
- 字节数: 1 字节
- 取值范围: -128 到 127
- 用途: 用于节省内存,通常用于处理原始二进制数据,例如文件 I/O。
-
boolean
- 字节数: 1 字节(尽管实际存储可能只需 1 位,但在 Java 中 JVM 通常使用 1 字节来存储)
- 取值范围: true 或 false
- 用途: 代表真/假(逻辑值),常用于条件控制语句。
-
char
- 字节数: 2 字节
- 取值范围: '\u0000' (或 0) 到 '\uffff' (或 65,535)
- 用途: 表示单个 16 位 Unicode 字符,用于处理字符和字符串。
-
short
- 字节数: 2 字节
- 取值范围: -32,768 到 32,767
- 用途: 用于节省内存,主要用于较小范围的整数。
-
int
- 字节数: 4 字节
- 取值范围: -2,147,483,648 到 2,147,483,647
- 用途: 表示常用的整数类型,适用于大多数整数计算。
-
float
- 字节数: 4 字节
- 取值范围: 大约 3.4E-38 到 3.4E+38(精确度为大约 7 位十进制数)
- 用途: 用于表示单精度浮点数,适用于需要小数的数字运算。
-
long
- 字节数: 8 字节
- 取值范围: -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
- 用途: 表示大范围的整数,主要用于存储非常大的整数值。
-
double
- 字节数: 8 字节
- 取值范围: 大约 1.7E-308 到 1.7E+308(精确度为大约 15 位十进制数)
- 用途: 用于表示双精度浮点数,适用于需要高精度小数的计算。
小结
Java 中的基本数据类型设计是为了高效使用内存和处理数据。不同的数据类型适合不同的应用场景;例如,
int
是默认的整型,double
是默认的浮点型,boolean
类型用于实现逻辑条件判断。
通过选择合适的类型,开发者可以合理利用内存并提高程序性能。
3、原子类型
Java 中的
int
等其他基本数据类型(如byte
、short
、char
、boolean
等)被认为是原子性的,而long
和double
类型并不一定被视为完全原子性的。
3.1、基本概念
1.原子性:
在多线程环境中,原子性指的是操作的不可分割性。一个原子操作要么完全执行,要么完全不执行,不会被其他线程的操作打断。
3.2、基本数据类型的原子性
基础类型的分类:
Java 的基本数据类型有:byte
、short
、int
、long
、char
、float
、double
和 boolean
。
其中,byte
、short
、int
、char
和 boolean
都是 32 位以下的基本数据类型(boolean
通常占用 1 位,但在 JVM 的实现中它可能为 1 字节),因此这些类型的读写操作在最常见的 CPU 架构上是原子性的。
3.3、原子操作的解释
1、32 位和 64 位系统:
在大多数现代 CPU 架构下,32 位整数(int
)和较小类型的变量可以在一个 CPU 指令中读写。这意味着对于这些类型,单一的读写操作一般不会被分割或打断。
而 long
和 double
类型是 64 位的。在某些老旧的 32 位 CPU 上,64 位的数据操作可能被限制为两个步骤:首先读取低 32 位,然后读取高 32 位。这在并发环境中会导致非原子性,因为在这两个步骤之间可能会发生上下文切换或其他线程的操作。
2、Java 内存模型:
Java 内存模型的线程之间包括原子性、可见性和有序性。在 JMM 中,32 位及以下的原始类型的读写操作被认为是原子操作。
而对于 64 位类型,虽然在许多现代编译器和平台上都是原子的,但 Java 不完全保证所有平台都兼容。因此,long
和 double
类型的某些操作可能在JVM实现中表现为非原子。
3.4、不保证原子性
Java 对基本类型的操作并不提供原子性保证。虽然 int
类型的操作是原子的,但 long
和 double
类型的操作,尤其是存取变更的方式,并不被认为是原子的。特别是在某些 JVM 实现或者在某些 CPU 架构上(例如某些 x86 架构),即使对这些类型的存取是原子的,Java 的内存模型并不保证这一点,这就意味着这种保障是不可靠的。
3.5、解决方案
为了保证对 long
和 double
类型的线程安全。
Java 提供了如下几种方法:
1、使用原子类:
Java 提供的 java.util.concurrent.atomic
包中的 AtomicLong
和 AtomicReference<Double>
可以用于原子操作。
AtomicLong atomicLong = new AtomicLong(0);
atomicLong.incrementAndGet(); // 原子的加1操作
2、使用同步机制:
对于复杂操作,可以使用 synchronized
关键字或其他显式锁(如 ReentrantLock
)来保护对共享变量的访问。
public synchronized void increment() {sharedLong++;
}
3、使用线程安全的数据结构:
适当使用 java.util.concurrent
包中的数据结构也可以避免多线程访问带来的问题。
小结
1.原子性:
int
与小于 32 位的类型在大多数现代硬件架构上被假定为原子,而 long
和 double
由于其 64 位特性在某些架构下未必是原子的。
2.复合操作:
需要注意的是,尽管单个基本类型的读写是原子的,但复合操作(如自增等)并不保证是原子的。在多线程环境中,组合的读取和写入必须要使用适当的同步机制来确保线程安全。
4、原子性
在Java中,原子性(Atomicity)指的是操作的不可分割性,即操作要么完全成功,要么完全失败,确保其他线程无法在操作的中间状态访问共享数据。
实现原子性通常是多线程编程中的一项重要考虑因素,尤其是在访问共享变量时。
4.1、原子类
Java提供了一些原子类,这些类位于 java.util.concurrent.atomic
包中,专门用于处理简单的整数、布尔值等类型的并发性操作,而不必使用同步。
核心的原子类包括:
AtomicInteger
AtomicLong
AtomicBoolean
AtomicReference<T>
这些类提供了一系列原子操作的方法,例如 incrementAndGet()
, decrementAndGet()
, 和 compareAndSet()
等,确保在并发环境中对变量的更新是原子的。
import java.util.concurrent.atomic.AtomicInteger;public class AtomicExample {public static void main(String[] args) {AtomicInteger atomicInt = new AtomicInteger(0);// 原子性加1atomicInt.incrementAndGet();// 原子性设置值atomicInt.set(5);// 原子性比较和设置atomicInt.compareAndSet(5, 10);System.out.println(atomicInt.get()); // 输出 10}
}
4.2、同步块、锁和关键字
对于复杂的操作,Java提供了 synchronized
关键字和 ReentrantLock
等工具来确保多个线程在执行特定代码块时,彼此不能干扰。
public class SynchronizedExample {private int counter = 0;public synchronized void increment() {counter++;}public int getCounter() {return counter;}
}
4.3、volatile 关键字
volatile
关键字用于指示一个变量的值对所有线程是可见的,确保读写操作不会被缓存。但它并不能保证复合操作(如读取-修改-写入)的原子性。
了解更多volatile介绍可参考:对于Synchronized和Volatile的深入理解_java的synchronized,volatile要怎么使用,有啥区别-CSDN博客
public class VolatileExample {private volatile int counter = 0;public void increment() {counter++; // 这不是原子操作}public int getCounter() {return counter;}
}
4.4、并发容器
Java的 java.util.concurrent
包提供了一些线程安全的容器(例如 ConcurrentHashMap
, CopyOnWriteArrayList
等),它们内建了对内部数据结构的同步,确保了并发访问的原子性。
总结
通过使用原子变量、多线程同步机制如 synchronized
、显式锁等,可以确保复杂操作和共享变量的安全访问,选择合适的同步方式可以有效防止数据竞争和一致性问题。
如果在多线程中安全使用
long
和double
,推荐使用AtomicLong
和AtomicDouble
以确保原子操作的安全性,可以避免由数据竞争导致的问题。
参考文章:
1、对于Synchronized和Volatile的深入理解_java的synchronized,volatile要怎么使用,有啥区别-CSDN博客
2、java关键字-CSDN博客
相关文章:
关于计算机系统和数据原子性的联系
目录 1、计算机架构 1.1、处理器架构 1.2、内存寻址能力 1.3、性能差异 1.4、软件兼容性 1.5、指令集 1.6、开发和维护 2.、基本数据类型 3、原子类型 3.1、基本概念 3.2、基本数据类型的原子性 3.3、原子操作的解释 3.4、不保证原子性 3.5、解决方案 4、原子性…...
Armijo rule
非精线搜索步长规则Armijo规则&Goldstein规则&Wolfe规则_armijo rule-CSDN博客 [原创]用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则 – 编码无悔 / Intent & Focused...
从数据包到可靠性:UDP/TCP协议的工作原理分析
之前我们已经使用udp/tcp的相关接口写了一些简单的客户端与服务端代码。也了解了协议是什么,包括自定义协议和知名协议比如http/https和ssh等。现在我们再回到传输层,对udp和tcp这两传输层巨头协议做更深一步的分析。 一.UDP UDP相关内容很简单…...
Prometheus实战教程:k8s平台-Mysql监控案例
配置文件优化后的 Prometheus 自动发现 MySQL 实例的完整 YAML 文件。该配置包括: MySQL Exporter 部署:使用 ConfigMap 提供 MySQL 连接信息。Prometheus 自动发现:通过 Kubernetes 服务发现自动抓取 MySQL 实例。 1、mysql 配置文件 &…...
执行apt-get update 报错ModuleNotFoundError: No module named ‘apt_pkg‘的解决方案汇总
Ubuntu版本ubuntu18.04 报错内容: //执行apt-get upgrade报错: Traceback :File “/usr/lib/cnf-update-db”, line 8, in <module>from CommandNotFound.db.creator import DbcreatorFile “/usr/lib/python3/dist-packages/CommandNotFound/db…...
QT6 源(101)篇一:阅读与注释 QPlainTextEdit,其继承于QAbstractScrollArea,属性学习与测试
(1) (2) (3)属性学习与测试 : (4) (5) 谢谢...
Redis(2):Redis + Lua为什么可以实现原子性
Redis 作为一款高性能的键值对存储数据库,与 Lua 脚本相结合,为实现原子性操作提供了强大的解决方案,本文将深入探讨 Redis Lua 实现原子性的相关知识 原子性概念的厘清 在探讨 Redis Lua 的原子性之前,我们需要明确原子性的概念…...
ios打包ipa获取证书和打包创建经验分享
在云打包或本地打包ios应用,打包成ipa格式的app文件的过程中,私钥证书和profile文件是必须的。 其实打包的过程并不难,因为像hbuilderx这些打包工具,只要你输入的是正确的证书,打包就肯定会成功。因此,证书…...
Python生成器:高效处理大数据的秘密武器
生成器概述 生成器是 Python 中的一种特殊迭代器,通过普通函数的语法实现,但使用 yield 语句返回数据。生成器自动实现了 __iter__() 和 __next__() 方法,因此可以直接用于迭代。生成器的核心特点是延迟计算(lazy evaluation&…...
C++11(2)
文章目录 右值引用和移动语义在传参中的提效list容器push_back & insert右值版本的模拟实现类型分类 (了解即可)引用折叠万能引用 完美转发(跟引用折叠有关) 简介:这篇文章是继续介绍C11的一些新语法知识点,也是对…...
unity terrain 在生成草,树,石头等地形障碍的时候,无法触发碰撞导致人物穿过模型
1.terrain地形的草,石头之类要选择模型预制体 2.在人物身上挂碰撞器和刚体,或者单挂一个character controller组件也行 3.在预制体上挂碰撞盒就好了,挂载meshcollider会导致碰撞无效...
以项目的方式学QT开发C++(二)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
API 描述 函数原型 参数说明 push_back() 在 list 尾部 添加一个元素 void push_back(const T& value); value :要添 加到尾部的元 素 这个示例演示了如何创建 std::list 容器,并对其进行插入、删除和迭代操作。在实际应用中&am…...
养生:健康生活的极简攻略
在追求高效生活的当下,养生也能化繁为简。通过饮食、运动、睡眠与心态的精准调节,就能轻松为健康续航。 饮食上,遵循 “均衡、节制” 原则。早餐用一杯热豆浆搭配水煮蛋和半个苹果,唤醒肠胃活力;午餐以糙米饭为主食&am…...
C语言-8.数组
8.1数组 8.1.1初试数组 如何写一个程序计算用户输入的数字的平均数? #include<stdio.h> int main() {int digit;//输入要求平均数的数字double sum=0;//记录输入数字的和int count=0;//记录输入数字的个数printf("请输入一组数字,用来求平均数,以-1结束\n&quo…...
代码随想录算法训练营第四十一天
LeetCode题目: 739. 每日温度496. 下一个更大元素 I503. 下一个更大元素 II 其他: 今日总结 往期打卡 739. 每日温度 跳转: 739. 每日温度 学习: 代码随想录公开讲解 问题: 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer &…...
c++,windows,多线程编程详细介绍
目录 一、C11 标准库 <thread> 实现多线程编程1. 基本线程创建2. 线程管理3. 线程传参4. 同步机制5. 异步编程 二、Windows API 实现多线程编程1. 基本线程创建2. 线程管理3. 线程传参 三、两种方法的对比 在 Windows 平台上使用 C 进行多线程编程,可以通过 C…...
Python多线程
Python多线程 作为一名Python开发者,你是否遇到过这样的场景:程序需要同时处理多个任务,但单线程执行效率太低?这时候,多线程技术就能派上用场了。本文将带你深入浅出地理解Python多线程,并通过丰富的示例…...
VisionPro斑点寻找工具Blob
斑点寻找工具Blob 斑点概述 斑点分析 探测并且分析图像中的二维形状Blob是先根据用户设定好的灰阶范围对图像进行分割,然后对目标进行查找和分析。斑点报告多种属性: 面积质心周长主轴…….. 应用场景 Blob分析非常适合以下场合的应用: 对…...
【Python】【面试凉经】Fastapi为什么Fast
核心的关键词:ASGI、原生异步、协程、uvloop、异步生态、Pydantic编译时生成校验代码、DI system预计算依赖树 interviewer 00:32:49 FastAPI 它优越于其他一些主流web框架像 django或 flask 的这个点在哪里? 我 00:33:00fastapi 就是说它的 fast 性能高…...
LocalDateTime类型的时间在前端页面不显示或者修改数据时因为LocalDateTime导致无法修改,解决方案
1.数据库中的时间数据,在控制台可以正常返回,在前端无法返回,即显示空白,如下图所示: 2.这种问题一般时由于数据库和我们实体类的名称不一致引起的,我们数据库一般采用_的方式命名,但是在Java中我们一般采用…...
【Linux】gcc从源码编译安装,修改源码,验证修改的源码
前阵子电脑使用的win10,win10过几天就让升级,烦得不行。 然后把操作系统切换到ubuntu24的样子,然后也是让升级,又烦的不行,然后切换到ubuntu server版本,感觉用起来要舒服些了,至少不会天天让升级。 回到标…...
牛客网NC22157:牛牛学数列2
牛客网NC22157:牛牛学数列2 📝 题目描述 🔍 输入输出说明 输入描述: 输入一个整数 N,范围在 0 到 1000 输出描述: 输出一个保留6位小数的浮点数 示例: 输入:2输出:1.500000 …...
智能手表集成测试报告(Integration Test Report)
📄 智能手表集成测试报告(Integration Test Report) 项目名称:Aurora Watch S1 测试阶段:系统集成测试 测试周期:2025年xx月xx日 – 2025年xx月xx日 报告编号:AW-S1-ITR-2025-001 版本…...
1C:ENTERPRISE 8.3 实用开发者指南-示例和标准技术(Session1-Session3)
1C:ENTERPRISE 8.3(1课-3课) 本博客是全网首个关于1C:Enterprice的中文指南,支持快速吸收使用 1C:Enterprise 8.3 软件开发和调整应用程序的技术 在这篇博客中我会基于实际应用示例,演示各种系统对象的结构、功能和用法。使用内…...
AgenticSeek开源的完全本地的 Manus AI。无需 API,享受一个自主代理,它可以思考、浏览 Web 和编码,只需支付电费。
一、软件介绍 文末提供程序和源码下载 AgenticSeek开源的完全本地的 Manus AI。无需 API,享受一个自主代理,它可以思考、浏览 Web 和编码,只需支付电费。这款支持语音的 AI 助手是 Manus AI 的 100% 本地替代品 ,可自主浏览网页…...
Java类一文分解:JavaBean,工具类,测试类的深度剖析
解锁Java类的神秘面纱:从JavaBean到测试类的深度剖析 前言一、JavaBean 类:数据的守护者(一)JavaBean 类是什么(二)JavaBean 类的特征(三)JavaBean 类的使用场景(四&…...
2025认证杯数学建模第二阶段C题:化工厂生产流程的预测和控制,思路+模型+代码
2025认证杯数学建模第二阶段思路模型代码,详细内容见文末名片 一、探秘化工世界:问题背景大揭秘 在 2025 年 “认证杯”数学中国数学建模网络挑战赛第二阶段 C 题中,我们一头扎进了神秘又复杂的化工厂生产流程预测与控制领域。想象一下&…...
day 17 无监督学习之聚类算法
一、聚类流程 1. 利用聚类发现数据模式 无监督算法中的聚类,目的就是将数据点划分成不同的组或 “簇”,使得同一簇内的数据点相似度较高,而不同簇的数据点相似度较低,从而发现数据中隐藏的模式。 2. 对聚类后的类别特征进行可视…...
渗透测试流程-上篇
#作者:允砸儿 #日期:乙巳青蛇年 四月十八 本期就开始进入到网安的内容了笔者会和大家一起开始实操练习。在此之前笔者的老师和我说要知己知彼,胆大心细。笔者也把他的理念传出去,网安的知识比较复杂且使用的工具很多。笔者看过…...
Ubuntu离线安装Minio
MinIO 支持在 Linux 环境下离线安装,非常适合内网或无法联网的服务器环境。下面是详细的 Linux 离线安装 MinIO 服务端 的步骤: ✅ 一、准备工作 1. 创建安装目录(可选) mkdir -p /opt/minio cd /opt/minio2. 下载 MinIO 可执行…...
2025年山东省数学建模F题思路
2025年山东省数学建模F题思路 一、问题背景 在现代金融市场中,资产价格波动呈现出非线性、高噪声、强跨市场联动性等复杂动态特征。例如,2020年新冠疫情期间,美股数次熔断事件引发全球股市剧烈震荡;而2023年美元加息周期&#x…...
C++核心编程--3 函数提高
函数的一些高级用法。 3.1 函数形参默认值 C中,函数的形参可以有默认值,调用函数时,未进行赋值的形参会使用默认值 void func(int f_var1 10, int f_var2 20); // 声明 void func(int f_var1, int f_var2) // 定义 {std::cout <&l…...
AI Agent开发第67课-彻底消除RAG知识库幻觉(1)-文档分块全技巧
开篇 在上篇《AI Agent开发第66课-彻底消除RAG知识库幻觉-带推理的RAG》放出后,网友们反响很大。有得告诉我:原来还有Rewrite这么一招?早知道这一招很多之前的一些遗留问题都能解决了。不过在上一篇结尾我已经提到了,要真正解决一个AI Agent在响应时产生的幻觉我们用提示语…...
c++多态面试题之(析构函数与虚函数)
有以下问题展开 析构函数要不要定义成虚函数?基类的析构函数要不要定义成虚函数?如果不定义会有什么问题,定义了在什么场景下起作用。 1. 基类析构函数何时必须定义为虚函数? 当且仅当通过基类指针(或引用)…...
buildroot使用外部编译链编译bluez蓝牙工具
buildroot使用外部编译链编译bluez蓝牙工具 主要参见这个csdn buildroot使用外部编译链编译bluez蓝牙工具_bluez编译-CSDN博客 设置交叉编译工具路径时,设置到bin目录之前 如果menuconfig不能改路径,就去 .config下去改 这样才能编译过...
自定义类型:结构体
1.结构体类型的声明 1.1.1结构的声明 struct tag {member-list; }variable-list; 描述一个学生:只包含了学生的名字、年龄、性别、学号 struct Stu {char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号 }; 1.1.2 结构体变量的创建和初始…...
以项目的方式学QT开发C++(一)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
以项目的方式学QT开发 以项目的方式学QT开发 P1 QT介绍 1.1 QT简介 1.2 QT安装 1.2.1 Windows QT安装 1.2.2 QT Creator 使用基本介绍 P2 C基础 2.1 命名空间 2.1.1 命名空间作用 2.1.2 自定义命名空间 2.2 从C语言快速入门 2.2.1 输入输出 2.2.2 基…...
Spring框架的事务管理
引言 在企业级应用开发中,事务管理是一个至关重要的环节,它确保了数据的一致性和完整性。Spring 框架为我们提供了强大而灵活的事务管理功能,能够帮助开发者更轻松地处理复杂的事务场景。本文将深入探讨 Spring 框架的事务管理,包…...
TypeScript:类
一、基本概念 TypeScript 类是基于 ES6 类的语法扩展,增加了类型注解和访问修饰符等特性,提供了更强大的面向对象编程能力。 二、基本语法 class Person {name: string;age: number;constructor(name: string, age: number) {this.name name;this.ag…...
Python继承
在Python编程中,继承是一个让新手又爱又怕的概念。今天我们就来聊聊这个看似高深实则简单的特性,保证让你看完后能拍着胸脯说:“继承嘛,小菜一碟!” 一、什么是继承? 想象一下你正在玩一个养成游戏。你创…...
浏览器宝塔访问不了给的面板地址
注意你们的端口,服务器的端口开放了没!!!宝塔给的端口是否在范围之内!! 我的当时是1000/10000 (阿里云服务器) 但是宝塔给的是 4W多 对不上!! 更换安全组…...
强化学习入门:马尔科夫奖励过程
文章目录 前言1、组成部分2、应用例子3、马尔科夫奖励过程总结 前言 最近想开一个关于强化学习专栏,因为DeepSeek-R1很火,但本人对于LLM连门都没入。因此,只是记录一些类似的读书笔记,内容不深,大多数只是一些概念的东…...
RHCE实验:通过脚本判断用户是否存在
一、实验要求 1、 写一个脚本,使用函数完成 1 、函数能够接受一个参数,参数为用户名; 判断一个用户是否存在 如果存在, 就返回此用户的 shell 和 UID ;并返回正常状态值; 如果不存在,就说此用…...
Windows软件插件-音视频捕获
下载本插件 音视频捕获就是获取电脑外接的话筒,摄像头,或线路输入的音频和视频。 本插件捕获电脑外接的音频和视频。最多可以同时获取4个视频源和4个音频源。插件可以在win32和MFC程序中使用。 使用方法 首先,加载本“捕获”DLL,…...
每日算法 - 【Swift 算法】Two Sum 问题:从暴力解法到最优解法的演进
【Swift 算法】Two Sum 问题:从暴力解法到最优解法的演进 本文通过“Two Sum”问题,带你了解如何从最直观的暴力解法,逐步优化到高效的哈希表解法,并对两者进行对比,适合算法入门和面试准备。 💡 问题描述 …...
2025年,如何制作并部署一个完整的个人博客网站
欢迎访问我的个人博客网站:欢迎来到Turnin的个人博客 github开源地址:https://github.com/Re-restart/my_website 前言 2024年年初,从dji实习回来之后,我一直想着拓宽自己的知识边界。在那里我发现虽然大家不用java,…...
深度学习框架---TensorFlow概览
一、TensorFlow 概述 1. 发展历程 1.x 版本:基于静态图(Graph)和会话(Session),需预先定义计算图,调试较复杂。2.x 版本:默认启用动态图(Eager Execution)&…...
鸿蒙OSUniApp制作自定义的下拉菜单组件(鸿蒙系统适配版)#三方框架 #Uniapp
UniApp制作自定义的下拉菜单组件(鸿蒙系统适配版) 前言 在移动应用开发中,下拉菜单是一个常见且实用的交互组件,它能在有限的屏幕空间内展示更多的选项。虽然各种UI框架都提供了下拉菜单组件,但在一些特定场景下&…...
扣子(Coze)案例:工作流生成小红书心理学卡片
大家好!我是 Robin。专注于 AI 技术探索与实践,持续分享 Coze 智能体、Coze 模板,以及 Coze 工作流搭建案例。 工作流智能体作用: 输入需要生成小红书心理学知识卡片的数量,工作流自动批量生成图文。 首先演示一下生…...
深度理解用于多智能体强化学习的单调价值函数分解QMIX算法:基于python从零实现
引言:合作式多智能体强化学习与功劳分配 在合作式多智能体强化学习(MARL)中,多个智能体携手合作,共同达成一个目标,通常会收到一个团队共享的奖励。在这种场景下,一个关键的挑战就是功劳分配&a…...