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

多线程(二)

今天先来了解一个上一期的遗留概念 —— 前台线程与后台线程

一 . 前台线程与后台线程 

大家应该多多少少都听过酒桌文化,咱们平常吃饭,座位次序是没有那么多讲究的,但是在跟领导吃饭,或者出席宴会和一些重要场所的饭局时,这个座位次序,朝向都是非常有讲究的,那么通过酒桌文化这个例子,我们就可以生动形象的描述出前台线程与后台线程关系

前台线程与后台线程的概念 

前台线程:如果某个线程在执行过程中,能够阻止进程结束,该线程就被称为 “ 前台线程 ”。

后台线程:如果某个线程在执行过程中,不能够阻止进程结束,该线程就被称为 “ 后台线程 ”,后台线程又叫做 “ 守护线程 ”。

情景一:今天我们参加一个酒席,这个酒席就是一个 “ 进程 ”,围着桌子坐着这一圈,其中有一位领导,咱们就叫他王书记。当饭局进行过半了呢,这个时候,我吃饱了,我就想溜了,我就站起来说,我吃饱了,我先走了。但是呢,我作为一个小透明,咱没啥地位,咱说话不管用啊,所以,我说话并不管用,酒席仍然照常进行,所以我在这个酒席中扮演的就是一种 “ 后台线程的角色。

情景二:饭吃到一半,王书记说,我觉得大家都吃的差不多了,那么今天就到此为止吧,这个时候,就算我还没吃饱,我还想吃,但是不管用,人家王书记发话了是吧,这个时候,咱们也只有乖乖地跟着退场了,所以王书记在这个酒席中扮演的就是一种 “ 前台线程的角色。“ 前台线程就有着决定 “ 进程 ” 结束与否的权利。

在同一个进程当中,可以有多个前台线程。且当有多个前台线程的时候,必须所有的前台线程都结束了,该进程才会结束。

情景三:饭吃到一半,王书记说,我觉得大家都吃的差不多了,那么今天就到此为止吧,这个时候咱们旁边的李主任发话了,说我还没喝尽兴呢,咱们再喝会儿,那么这个酒席在这时候就散不了。等到什么时候李主任、王书记都觉得喝好了,并且此时桌子上也没有其他领导(前台线程)了,那么这个时候,酒席就应该真正结束了。

在咱们 Java 中,main(主线程)默认就是前台线程,无需设置。

二 . 线程的状态 

线程大致分为六种状态:

(1)NEW:当前的 Thread对象虽然有了,但是内核的线程还没开始(还未调用 start )。

(2)TIMED_WAITING:当前的 Thread对象虽然还在,但是内核的线程已经被销毁了(线程已经结束)。

(3)BLOCKED:因为锁竞争引起的阻塞(有关 “ 锁 ” 这一概念,我们接下来会讲到)。

(4)WAITING:没有超时间的阻塞等待,比如 sleep、join(带参数版本)。

(5)TERMINATED:超时间的阻塞等待,比如 sleep、join(带参数版本)。

(6)RUNNABLE:就绪状态,正在 CPU 上运行或者随时可以去 CPU 上运行。

上述的线程状态,都可以通过 jconsole 观察到。

三 . 多线程带来的风险 —— 线程安全 

接下来就是我们的重头戏,重中之重!关于多线程的安全问题。

咱们直接来看一个例子:

咱们可以看到,我们这段代码,通过两段 for 循环,对 count 进行两段 50000 的自增,我们的预期应该是 100000,可是结果不但不等于 100000,并且通过多次运行我们发现,每次得到的结果都不一样,这是为什么呢?

这是因为,不同架构的 CPU 有不同的指令集。而 count++ 这一操作在 CPU 的视角上来看,是细分为三个指令的

(1)load:把内存中的数据读取到 CPU 寄存器中。

(2)add:把 CPU 寄存器里的数据 + 1 。

(3)save:把寄存器中的数据再写回内存。

针对这三个操作,不同 CPU 里的指令集对应指令的名称不同,例如:X86 的 CPU 和 arm 的 CPU 和 mips 的 CPU 还有 risc - v 的 CPU 都会有对应的操作,但是具体指令的名字有差异。

而 CPU 在调度执行的时候,我们两个线程是针对同一个 count 进行操作的,(此时的 count 是一个多个线程都可以访问的到的 “ 共享数据 ”)而我们线程调度运行,是一种 “ 抢占式执行,随机调度 ”,随时有可能把线程给切换走,咱们看图理解:

这是咱们理想的执行顺序,t1 执行完一次然后再由 t2 执行(t2 执行完再由 t1 执行也可以)。

但是经常会出现以下情况:

如果是以上的这类情况,咱们就可以看出,当我们其中一个线程刚刚改完寄存器中的数据,还未将值写回内存,此时线程就被切走了,那么后续明明是两次自增的值就会被覆盖,实际上只自增了一次,这就是为什么我们得不到理想值 100000 且每次的值都不一样。

这里大家思考一个问题,咱们运行的值有没有可能小于 50000 呢?答案是可能的,理论上来讲,有可能会出现咱们以下这种在一个线程还未执行完,另一个线程被调度执行的两次的情况(虽然这种情况可能性极小,但是理论上可实现):

四 . 锁 

那么为了解决上述问题,咱们就引入了一个概念 —— 锁,咱们对概念进行 “ 上锁操作 ”,让这三个分开的指令变成一个不可分割的 “ 原子 ”,这个时候我们在执行线程调度的时候就不会存在这一个线程还没执行完就被切走的状况。

 synchronized 关键字 

(1)synchronized的互斥性:

要使用锁咱们就必须要使用 synchronized 关键字。synchronized 会起到互斥效果,某个线程执行到某个对象的 synchronized 当中时,其它线程如果也执行到同一个对象,synchronized 就会变成阻塞等待状态,等待另一个线程执行完再执行,这就是我们的 “ 上锁操作 ”。

1 . 进入 synchronized 修饰的代码块自动加锁。

2 . 退出 synchronized 修饰的代码块自动解锁。

关于 synchronized(){},()中放的是指定锁对象,锁对象可以写成任意 的 Object 或其子类,{} 放的就是要打包成一个整体的代码。当然,我们对于要执行的两个或多个线程,都必须加锁,一个加锁,另一个不加锁,等于没有锁。

(就比如我们所见到的公共厕所的门锁,当有人进去上厕所并锁门时,此时我们再想进去就只能等这个人 “ 完成任务 ” 出来,将锁解开,咱们才能进去)

这个时候我们不管运行多少次,得到的答案都是我们预期结果 100000。

(2)synchronized的可重入性:

同一个线程加锁两次,就会出现死锁的情况:

死锁情景一:

死锁情景二:

在我们 Java 中 synchronized 对于同一线程来说是 “ 可重入锁 ”,不会出现自己把自己锁死的情况,而 C++ / Python 中的锁,就没有进行这样的特殊处理,二次加锁就会出现死锁。

死锁情景三:

还有一种特殊的情景,这种情况下形成的死锁,咱们 Java 的可重入锁机制也无能为力了。

例如:我们此时有两个线程 t1,t2,有两把锁 locker1,locker2

1 .  t1 先对 locker1 加锁, t2 先对 locker2 加锁。

2 .  t1 在未释放 locker1 的情况下,再对  locker2 加锁;同时 t2 在未释放 locker2 的情况下,再对  locker1 加锁。

这个样子 t1 在等待 t2 释放 locker2,而 t2 在等待 t1 释放 locker1,谁也不让着谁,。

总结一下,形成死锁的四个必要条件:

(1)锁的基本特性:锁是互斥的。

(2)锁是不可被抢占的:线程一拿到了锁,如果线程一不主动释放锁,那么线程而就不能将锁强行抢过来。

(3)请求和保持:线程一拿到了锁一,在线程一未释放锁一的情况下再去拿锁二。

(4)循环等待 / 环路等待 / 循环依赖:多个线程获取锁的过程,存在循环等待。

(重点注意:synchornized 是可重入锁!!!)

 volatile 关键字 

volatile 关键字所修饰的变量,能保持内存的 “ 可见性 ”。

内存可见性问题:内存可见性问题本质上是编译器 / JVM 对代码进行优化的时候,优化出 “BUG”。如果代码是单线程的,编译器 / JVM 优化代码时非常准确的。优化之后,不会影响到逻辑。但是代码如果是多线程的,编译器 / JVM 优化代码时就可能出现误判(编译器 / JVM 的 BUG)导致不该优化的地方进行了优化,这也就造成了我们的 “ 内存可见性 ” 问题。

如上述代码所示,此时我们运行该代码,不管输入什么值,发现程序根本动不了,这是因为我们编译器的自动优化,会一直默认我们的 n = 0,不会改变,所以此刻我们即使对变量 n 赋值使其为非零数,依旧不能走出循环。

在我们上述线程中,这个 while 循环会执行非常非常非常多次,而每次循环执行到这里,就会执行一个 n == 0 的这样一个判定,大致分为两步:

(1)从内存中读取数据到寄存器中(这一步非常慢)。

(2)通过类似于 cmp 指令比较寄存器里的 n 值与 0(这个指令执行的非常快)。

此时当我们的 JVM 在执行到这一代码的时候,发现每次循环的过程中,执行操作(1)的开销非常大,并且每次循环的结果都是一样的啊,JVM 根本没意识到,用户可能在未来对 n 的值进行修改。所以它就自作主张,直接将操作(1)这一步骤给优化掉了。

因此再后来我们每次循环的时候,不会重新读取内存中的数据,而是直接读取寄存器 / cache 中的数据(缓存的结果)。但是,当我们用户修改 n 的值的时候,即使内存中的 n 的值已经发生改变,但是由于 t1 线程每次循环,不会去真正地读内存,感知不到 n 的存在。综上所述,优化过后,内存中 n 的改变,对于 t1 线程来说是 “ 不可见 ” 的。

此处就需要引出我们的 volatile 关键字,当变量被 volatile 关键字所修饰时,在系统内就会提示编译器,这个变量是易变的,在后续我们会赋予其新的值,所以编译器就不会对这个变量进行优化。

如图所示,我们将变量 n 使用 volatile 修饰后,代码便可以正常运行了。volatile 修饰某个变量,就是告诉编译器,这个变量的值是 “ 易变 ” 的,不要对其进行优化。

注意:volatile 只是解决内存存在性问题,不能解决原子性问题。如果两个针对同一个变量进行修改(如 count++ ),此时 volatile 就无能为力了。

OKK,今天有关于多线程的讲解就到此为止,咱们欲知后事如何,且听下回分解,咱们下期见!与诸君共勉!!!

相关文章:

多线程(二)

今天先来了解一个上一期的遗留概念 —— 前台线程与后台线程 一 . 前台线程与后台线程 大家应该多多少少都听过酒桌文化,咱们平常吃饭,座位次序是没有那么多讲究的,但是在跟领导吃饭,或者出席宴会和一些重要场所的饭局时&#…...

2025年,大模型LLM还有哪些可研究的方向?

近两年LLM在学术界与工业界的发展大家都有目共睹。到了今年,以预训练LLM为代表的大模型PK上半场已然结束,接下来就要进入下半场大模型2.0时代了。 那么在这新赛道,关于大模型我们还有什么可做的创新?要知道,如今的大模…...

VS打断点调试,无法命中断点或断点失效,解决方法

1.打开需要打断点的模块,点击属性,将C/C常规的调试信息格式改为程序数据库(/Zi) 2.将C/C的优化禁用(/Od) 3.将链接器中的生成调试信息改为生成调试信息(/DEBUG) 注:如果需…...

ELF文件详解

ELF 文件不仅仅是一个格式,它是 Linux 世界中程序的"灵魂容器",承载着程序从编译到执行的整个生命周期。 今天咱们来聊一个看起来高深,实际上理解起来其实挺简单的话题—— ELF 文件。 不知道你有没有想过:我们敲下./…...

【学习笔记】Shell编程---流程控制语句

最近学了好多个流程控制语句,都有点混乱了,赶紧先把各种用法记录下来! if 语句 语法格式: if 条件测试命令串 then 条件为真时执行的命令 else 条件为假时执行的命令 fi 以关键字if开头,后跟条件测试表达式&…...

TensorFlow 常见使用场景及开源项目实例

TensorFlow 常见使用场景及开源项目实例 摘要 本文详细介绍了 TensorFlow 在多个领域的典型应用及其对应的开源项目案例。涵盖了图像处理、自然语言处理、语音音频处理、推荐系统与时间序列预测、移动端与边缘计算以及生成式模型与创意应用等多方面内容,列举了大量…...

王炸组合!STL-VMD二次分解 + Informer-LSTM 并行预测模型

往期精彩内容: 单步预测-风速预测模型代码全家桶-CSDN博客 半天入门!锂电池剩余寿命预测(Python)-CSDN博客 超强预测模型:二次分解-组合预测-CSDN博客 VMD CEEMDAN 二次分解,BiLSTM-Attention预测模型…...

OpenCV进阶操作:风格迁移以及DNN模块解析

文章目录 前言一、风格迁移1、风格迁移是什么?2、步骤1)训练2)迁移 二、DNN模块1、什么是DNN模块2、DNN模块特点3、流程图4、图像预处理功能 三、案例实现1、数据预处理2、加载模型 总结 前言 风格迁移(Style Transfer&#xff0…...

使用bitNet架构

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、配置二、报错总结 前言 大型语言模型(LLM)面临的挑战:高能耗、高内存需求、部署门槛高。 微软提出 BitNet 架构&#x…...

OpenCV中的光流估计方法详解

文章目录 一、引言二、核心算法原理1. 光流法基本概念2. 算法实现步骤 三、代码实现详解1. 初始化设置2. 特征点检测3. 光流计算与轨迹绘制 四、实际应用效果五、优化方向六、结语 一、引言 在计算机视觉领域,运动目标跟踪是一个重要的研究方向,广泛应用…...

Java集合框架详解与使用场景示例

Java集合框架是Java标准库中一组用于存储和操作数据的接口和类。它提供了多种数据结构,每种数据结构都有其特定的用途和性能特点。在本文中,我们将详细介绍Java集合框架的主要组成部分:List、Set和Queue,并通过代码示例展示它们的…...

多模态融合【十九】——MRFS: Mutually Reinforcing Image Fusion and Segmentation

目录 一.摘要 二.Introduction 三. 背景与动机 四.方法 4.1. 概述 4.2. IGM-Att模块 4.3. PC-Att模块 4.4. 任务头 五.实验 5.1. 数据集与实现细节 5.2. 语义分割 5.3. 图像融合 5.4. 消融研究 5.5. IGM-Att和PC-Att的应用增益 5.6. 复杂度讨论 5.7. 目标检测的…...

音频转文字-在线工具包及使用记录

资料来源:https://zhuanlan.zhihu.com/p/269603431(多种方案) 视频教程:https://www.youtube.com/watch?vL1H5ov4WTBg https://github.com/openai/whisper // 创建虚拟环境 python -m venv myvnev// 激活虚拟环境 source myvne…...

集合-进阶

Collection collection的遍历方式 迭代器遍历 不依赖索引 import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class mycollection {public static void main(String[] args) {//1.创建集合并添加元素Collection<String> co…...

【阿里云】阿里云 Ubuntu 服务器无法更新 systemd(Operation not permitted)的解决方法

零、前言 目前正在使用的Ubuntu服务器中&#xff0c;仅阿里云&#xff08;不止一台&#xff09;出现了这个问题&#xff0c;因此我判定是阿里云服务器独有的问题。如果你的服务器提供商不是阿里云&#xff0c;那么这篇文章可能对你没有帮助。 如果已经因为升级错误导致依赖冲突…...

wpf DataGrid 行选择 命令绑定

在WPF中实现DataGrid行选择与命令绑定的MVVM模式,可通过以下方式结合代码示例实现: 1. ‌基础绑定与命令触发(SelectionChanged事件绑定)‌ 通过Interaction.Triggers捕获SelectionChanged事件,并绑定到ViewModel中的命令: <DataGrid ItemsSource="{Binding I…...

【认知思维】验证性偏差:认知陷阱的识别与克服

什么是验证性偏差 验证性偏差&#xff08;Confirmation Bias&#xff09;是人类认知中最普遍、最根深蒂固的心理现象之一&#xff0c;指的是人们倾向于寻找、解释、偏爱和回忆那些能够确认自己已有信念或假设的信息&#xff0c;同时忽视或贬低与之相矛盾的证据。这种认知偏差影…...

大容量存储的高性能 T-BOX 方案对智能网联汽车的支撑

在智能网联汽车快速发展的当下&#xff0c;车载 T-BOX&#xff08;Telematics Box&#xff09;作为车辆与云端互联的核心枢纽&#xff0c;其性能和可靠性直接决定了用户体验的上限。米客方德&#xff08;MK&#xff09;推出的基于 STM32H7RX 主控芯片与 MKDV4GIL-AST&#xff0…...

Linux 内核网络协议栈:从 Socket 类型到协议注册的深度解析

Linux 内核的网络协议栈是一个复杂而高效的体系,涉及多层次的协议处理与数据流转。本文通过分析核心数据结构(如 inetsw 数组、sock_type 枚举)和关键函数(如 inet_add_protocol),深入探讨其工作原理与设计哲学。 一、Socket 类型与 sock_type 枚举 1.1 Socket 类型的定…...

vim,gcc/g++,makefile,cmake

一、vim&#xff1a;你的小帮手——文本编辑器 它是干嘛的&#xff1f; 想象你的代码就像是写在一本“程序的笔记本”里&#xff0c;vim就是一个超级厉害的“数字笔记本”或“文字编辑器”。 它有什么用&#xff1f; 编写代码&#xff1a;编辑、修改你的源代码代码高亮&…...

解决 CentOS 7 镜像源无法访问的问题

在国内使用 CentOS 系统时&#xff0c;经常会遇到镜像源无法访问或者下载速度慢的问题。尤其是默认的 CentOS 镜像源通常是国外的&#xff0c;如果你的网络环境无法直接访问国外服务器&#xff0c;就会出现无法下载包的情况。本文将介绍如何修改 CentOS 7 的镜像源为国内镜像源…...

“傅里叶变换算法”来检测货物外形损坏

“傅里叶变换算法”来检测货物外形损坏 要使用傅里叶变换算法来检测货物外形损坏&#xff0c;首先需要理解基本概念。傅里叶变换是一种数学变换&#xff0c;用于将信号从时域&#xff08;或空间域&#xff09;转换到频域。在图像处理中&#xff0c;二维傅里叶变换可以用来分析…...

python打卡day24

可迭代对象、OS模块 知识点回顾&#xff1a; 元组可迭代对象os模块 作业&#xff1a;对自己电脑的不同文件夹利用今天学到的知识操作下&#xff0c;理解下os路径 1.元组 在day3的打卡内容中就介绍了元组&#xff0c;跟列表比起来就是用了圆括号&#xff0c;有序可以重复&#x…...

MapReduce 入门实战:WordCount 程序

一、引言 在大数据处理领域&#xff0c;MapReduce 是一种开创性的编程模型和处理框架&#xff0c;它使得我们能够高效地在大规模分布式系统上处理海量数据。而 WordCount 程序作为 MapReduce 的经典入门案例&#xff0c;堪称大数据领域的 “Hello World”&#xff0c;帮助无数…...

深度剖析:Vue2 项目兼容第三方库模块格式的终极解决方案

当我们为 Vue2 项目引入某些现代 JavaScript 库时&#xff0c;常常会遇到这样的报错&#xff1a; error in ./node_modules/some-lib/lib/index.mjs Cant import the named export xxx from non EcmaScript module这类问题的本质是模块格式的世纪之争 —— ES Module&#xff…...

5.11作业

拓扑图&#xff1a; 需求分析&#xff1a; 要求五台路由器的环回地址均可以相互访问 配置&#xff1a; r1 int g 0/0/0 i…...

MyBatis 批量新增与删除功能完整教程

一、功能概述 通过 MyBatis 动态 SQL 实现以下功能: 批量新增:一次性插入多条员工记录,支持自增主键回填。批量删除:根据 ID 数组一次性删除多条记录。二、代码逐行解析 1. Mapper 接口定义 // 批量新增:传入员工对象集合 void insertAll(List<Emp> empList);// …...

Spark,RDD中的行动算子

RDD中的行动算子 collect算子 格式&#xff1a;def collect(): Array[T] 参数说明&#xff1a;该算子没有参数。 并以数组的形式返回 统计个数 reduce算子 格式&#xff1a;def reduce(func: (T, T) > T): T 返回值&#xff1a;返回一个单一的值&#xff0c;其类型与…...

Linux:进程控制2

一&#xff1a;进程程序替换 1. 一旦程序替换成功&#xff0c;就去执行新代码了&#xff0c;原始代码的后半部分已经不存在了 2. exec*系列的函数&#xff0c;没有成功返回值&#xff0c;只有失败返回值-1 在程序替换的过程中&#xff0c;并没有创建新的进程&#xff0c;只是…...

Java jar包程序 启动停止脚本 shell bash

启动 启动时 可指定前缀&#xff08;名称&#xff09; start.sh #!/bin/bash # 使用时直接运行# 寻找当前目录下后缀为 .jar 的文件 #options($(find . -maxdepth 1 -type f -name "*.jar")) # 寻找当前目录下后缀为 .jar 的文件&#xff0c;并按时间倒序排序 opt…...

【Linux】进程通信 管道

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 一、&#x1f451;进程间通信分类 二、&#x1f451;管道 &#x1f31f;什么是管道&#xff1f; &#x1f31f;匿名管道 &#x1f389;原理&#xff1a; &#x1f525;站在文件描述…...

基于智能家居项目 解析DHT11温湿度传感器

一、模块简介 DHT11 是一款数字式温湿度传感器&#xff0c;内部集成了温度传感元件、湿度传感元件以及一个 8 位单片机芯片&#xff0c;用于采集数据和通信。。 测量范围&#xff1a;湿度 20%&#xff5e;90% RH&#xff0c;温度 0&#xff5e;50℃ 精度&#xff1a;湿度 5% …...

3.1 泰勒公式出发点

第一步&#xff1a;引入背景与动机 首先&#xff0c;泰勒公式&#xff08;Taylor Series&#xff09;是数学分析中的一个重要工具&#xff0c;它允许我们将复杂的函数近似为多项式形式。这不仅简化了计算&#xff0c;还帮助我们更好地理解函数的行为。那么为什么我们需要这样一…...

裸机开发的核心技术:轮询、中断与DMA

一、裸机开发的核心技术&#xff1a;轮询、中断与DMA 1. 轮询&#xff08;Polling&#xff09; 定义&#xff1a;程序主动、周期性地检查硬件状态或数据。应用场景&#xff1a;适用于简单、实时性要求不高的任务。示例&#xff1a; C while (1) { if (GPIO_ReadPin(SENSOR_P…...

从零开始:使用 Vue-ECharts 实现数据可视化图表功能

目录 前言为什么选择 Vue-ECharts案例&#xff1a;Vue-Echart开发一个分组柱状图 安装依赖 引入 全局引入 按需引入编写组件总结 前言 你好&#xff0c;小二&#xff01;很高兴你愿意分享关于 Vue-ECharts 的使用经验。 &#x1f4ca; Vue-ECharts&#xff1a;让你在 Vue 项…...

Antd中Form详解:

1.获取Form表单值的方式: ① 使用Form.useForm()钩子&#xff08;推荐方式&#xff09; const [form] Form.useForm();const getFormValues () > {const values form.getFieldsValue();};<Form form{form}>...<Form.Item label{null}><Button onClick{ge…...

(2)python开发经验

文章目录 1 pyside6加载ui文件2 使用pyinstaller打包 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1f448; 1 pyside6加载ui文件 方法1&#xff1a; 直接加载ui文件 from PySide6.QtWidgets import QAp…...

Landsat 5介绍

USGS Landsat 5 Level 2, Collection 2, Tier 1 数据集可用性&#xff1a;1984-03-16T16:18:01Z–2012-05-05T17:54:06Z 数据集提供程序 USGS Earth Engine 代码段 ee.ImageCollection("LANDSAT/LT05/C02/T1_L2") open_in_new 重新访问间隔&#xff1a;16 天 说…...

PowerShell 实现 conda 懒加载

问题 执行命令conda init powershell会在 profile.ps1中添加conda初始化的命令。 即使用户不需要用到conda&#xff0c;也会初始化conda环境&#xff0c;拖慢PowerShell的启动速度。 解决方案 本文展示了如何实现conda的懒加载&#xff0c;默认不加载conda环境&#xff0c;只…...

解锁ozon运营新路径:自养号测评技术如何实现降本增效

OZON测评自养号技术在跨境电商运营中具有显著的技术优势&#xff0c;主要体现在环境安全、账号控制、成本效率及风险规避等方面。以下是具体分析&#xff1a; 一&#xff1a;安全可控的测评环境搭建通过模拟俄罗斯本地物理环境和家庭住宅IP&#xff0c;自养号测评可规避平台风…...

算法第十七天|654. 最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

654. 最大二叉树 题目 思路与解法 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def constructMaximumB…...

Spring Boot 的自动配置为 Spring MVC 做了哪些事情?

Spring Boot 的自动配置为 Spring MVC 做了大量的工作&#xff0c;极大的简化了我们开发时的配置负担&#xff0c;我们可以快速启动并运行一个基于 Spring MVC 的 Web 应用。以下是 Spring Boot 自动配置为 Spring MVC 所做的主要事情&#xff1a; DispatcherServlet 的自动注册…...

【python】—conda新建python3.11的环境报错

1.报错 conda create -n py3.11 python3.11 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ Collecting package metadata: done Solving environment: failed PackagesNotFoundError: The following packages are not available from current channel…...

桑德拉精神与开源链动2+1模式AI智能名片S2B2C商城小程序的协同价值研究

摘要&#xff1a;本文深入剖析桑德拉无私奉献精神在商业领域的映射价值&#xff0c;结合开源链动21模式、AI智能名片及S2B2C商城小程序的技术特性&#xff0c;系统探讨其在用户赋能、资源协同与价值共创中的协同效应。研究表明&#xff0c;该技术组合通过去中心化激励、智能需求…...

JavaEE--初识网络

目录 一、IP地址 二、端口号 三、认识协议 四、五元组 五、协议分层 1. OSI七层模型 2. TCP/IP五层&#xff08;或四层&#xff09;模型 3. 网络设备所在分层 4. 封装和分用 一、IP地址 IP地址&#xff08;Internet Protocol Address&#xff09;是用于标识设备在网络…...

2.7/Q2,Charls最新文章解读

文章题目&#xff1a;Climate risks, multi-tier medical insurance systems, and health inequality: evidence from Chinas middle-aged and elderly populations DOI&#xff1a;10.1186/s12913-025-12648-2 中文标题&#xff1a;气候风险、多层次医疗保险制度和健康不平等—…...

Mac显卡的工作原理及特殊之处

目录 &#x1f9e0; 一、显卡的基本工作原理&#xff08;适用于所有平台&#xff09; &#x1f34f; 二、Mac 显卡的工作机制 1. Mac 使用的显卡类型 Intel 架构时代&#xff08;Intel CPU Intel/AMD 显卡&#xff09; Apple Silicon 时代&#xff08;M1/M2/M3 芯片&…...

MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置

视频讲解&#xff1a; MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置 今天分享的主题为创建自动化脚本编译MUSE Pi Pro的kernel内核&#xff0c;脚本已经上传到中 GitHub - LitchiCheng/MUSE-Pi-Pro-Learning: MUSE-Pi-Pro-Learning &#xff0c;有需要可以自行clon…...

flink的TaskManager 内存模型

Flink TaskManager 的内存模型是一个多层管理体系&#xff0c;从 JVM 进程到具体任务的内存分配均有明确的逻辑划分和配置策略。以下是其核心构成及运行机制&#xff1a; 一、内存模型总览‌ TaskManager 内存整体分为 ‌JVM 特有内存‌ 和 ‌Flink 管理内存‌ 两大层级&…...

【NLP 72、Prompt、Agent、MCP、function calling】

命运把我们带到哪里&#xff0c;就是哪里 —— 25.5.13 一、Prompt 1.User Prompt 用户提示词 当我们与大模型进行对话时&#xff0c;我们向大模型发送的消息&#xff0c;称作User Prompt&#xff0c;也就是用户提示词&#xff0c;一般就是我们提出的问题或者想说的话 但是我们…...