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

K8S学习之基础十九:k8s的四层代理Service

K8S四层代理Service

  1. 四层负载均衡Service
    在k8s中,访问pod可以通过ip+端口的方式,但是pod是由生命 周期的,pod在重启的时候ip地址往往会发生变化,访问pod就需要新的ip地址,这样就会很麻烦,每次pod地址改变就要修改访问ip。Service的引进解决了这种问题,通过定义Service资源对象,Service定义一个服务访问的入口,客户端可以通过这个入口访问对应的pod,就算pod重新生成,ip发生变化,Service依旧通过pod标签关联到这个pod,避免连接失败,这样看来,Service可以看做是一组Pod的逻辑组合。
    从下图可以看出客户端通过Service访问pod的方式
    pid的ip经常变化,service是pod的代理,只要访问service,就能代理到对应的pod
    pod的ip在集群外部是无法访问的,通过service,可以在集群之外的机器访问pod
    在这里插入图片描述
    Service是一个固定接入层,客户端可以通过访问Service的ip+port访问到其关联的后端pod。这个service工作以来与k8s集群之上部署的dns附件,现在的版本都是用的coredns。k8s要给客户端提供网络功能,还需要依赖第三方网络插件(flannel、calico等)。每个k8s几点上都有一个组件kube-proxy,始终监视着apiserver中有关service资源的变动信息,跟master上的apiserver交互,随时连接到apiserver获取任何一个与service资源相关的资源变动情况,通过k8s中固有的请求方式watch实现,一旦service资源内容发生变动(如创建删除等),kube-proxy都会将它转化成当前几点之上能够实现service资源调度,把请求调度到后端特定pod资源之上的规则,可能是iptables,也可能是ipvs,这个取决于service的实现方式。
    k8s在创建Service的时候,会根据标签选择器selector来查找pod,据此创建与Service同名的endpoint对象,当pod地址发生变化时,endpoint也会随之发生变化,service接收全段client请求时,就会通过endpoint,找到转发到哪个pod进行访问的地址,至于转发到哪个节点的pod,有负载均衡kube-proxy决定

  2. k8s集群中的三类ip地址
    Node Network(节点网络):物理节点或者虚拟节点的网络
    Pod network(pod网络):创建的pod的ip地址,在创建集群时指定网段
    ClusterNetwork(集群地址):也成为service network,这是个虚拟的ip地址,没有配置在某个接口上,只是出现在service规则当中。
    在这里插入图片描述

  3. service的四种类型,先创建一组pod,然后分别用不同类型的service测试

    vi service-pod.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:name: my-nginx
    spec:replicas: 3selector:matchLabels:app: my-nginxversion: v1template:metadata:labels:app: my-nginxversion: v1spec:containers:- name: my-nginximage: 172.16.80.140/nginx/nginx:1.26imagePullPolicy: IfNotPresentports:- containerPort: 80
    

    在这里插入图片描述
    ClusterIP:
    默认类型:创建 Service 时,默认类型为 ClusterIP。
    作用:为集群内部提供访问,Service 会分配一个内部 IP,只能在集群内部访问。
    适用场景:适用于集群内部服务间的通信。

     ![#pic_left](https://i-blog.csdnimg.cn/direct/a9c85a3758c2484ca08c6348102c1db6.png#pic_left =500x)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0e90c8172de94990b0020dc946af62d6.png#pic_left =500x)同时会创建一个endpoints(简称ep)
    ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/00ec03b596b8454b861ee8fdde8d268c.png#pic_left =500x)
    ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c3f7466a79d1497eba00a0965461a21b.png#pic_left =500x)
    可通过访问service的方式,访问到代理的pod,即使pod被删除一个,deploy创建一个新的pod,ip发生变化,但是pod标签没有变化,service没有变化,依然可以代理到所有同样标签的pod之上。
    

    NodePort:
    作用:在 ClusterIP 基础上,通过每个节点的 IP 和静态端口(NodePort)暴露服务,外部可通过 : 访问。
    端口范围:默认范围为 30000-32767。
    适用场景:适用于需要从集群外部访问的服务。
    上面的clusterip类型的service,只能在集群内部访问,无法在集群外部访问。为了解决这个问题,可以使用NodePort类型的service

    ```bashvi service-nodeport.yaml kind: Servicemetadata:name: my-servicespec:type: NodePortselector:app: my-nginxports:- protocol: TCPport: 80targetPort: 80生成一个nodeport类型的service,不但可以在集群内部访问,还可以通过访问node+port的方式访问,端口可以指定,也可以默认生成。其中node指集群中所有的节点。![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6a8a2bc832c74fd9b8ba4dea9a39630d.png#pic_left =500x)
    ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3b3be03ca43b4b598a228cb43aa0bf69.png#pic_left =500x)
    

    LoadBalancer:
    作用:在 NodePort 基础上,使用云服务商的负载均衡器将服务暴露到外部,自动分配外部 IP。
    适用场景:适用于在云环境中需要外部访问的服务。

    ExternalName:
    作用:将 Service 映射到外部 DNS 名称,不提供负载均衡或代理,仅返回 CNAME 记录。
    适用场景:适用于将服务指向外部资源。
    可用来做跨名称空间访问

    在test命名空间创建pod和svc,如果想要defult下的pod访问,就可以创建ExternalName类型的service,通过访问ExternalName访问test中的pod
    ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e6b7f61b3fe64dd3b3181964cfaa8087.png#pic_left =500x)
    ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a7f36c3709734f1d8280e4659eb7f1db.png#pic_left =500x)
    登录default中的pod,通过curl命令访问ExternalName类型的svc,可以访问到test的pod
    ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/56dcc181aa6a462a956ee874bab03024.png#pic_left =500x)
    

相关文章:

K8S学习之基础十九:k8s的四层代理Service

K8S四层代理Service 四层负载均衡Service 在k8s中,访问pod可以通过ip端口的方式,但是pod是由生命 周期的,pod在重启的时候ip地址往往会发生变化,访问pod就需要新的ip地址,这样就会很麻烦,每次pod地址改变就…...

C++:string容器(下篇)

1.string浅拷贝的问题 // 为了和标准库区分,此处使用String class String { public :/*String():_str(new char[1]){*_str \0;}*///String(const char* str "\0") // 错误示范//String(const char* str nullptr) // 错误示范String(const char* str …...

sudo systemctl restart docker 重启docker失败

一般会使用如下命令,进行docker重启。 sudo systemctl daemon-reload sudo systemctl restart docker 重启失败时,会提示:Job for docker.service failed because the control process exited with error code. See "systemctl status…...

Linux基本操作指令3

1、wget: 这是一个用于从网络上下载文件的命令行工具。它支持 HTTP、HTTPS 和 FTP 协议。 wget http://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run 2、下载完成后,你可以通过以下命令使文件可执行并运行安装程序: ch…...

React:类组件(上)

kerwin老师我来了 类组件的创建 class组件&#xff0c;js里的类命名首字符大写&#xff0c;类里面包括构造函数&#xff0c;方法 组件类要继承React.Component才有效 必须包含render方法 import React from react class App extends React.Component{render() {return <…...

sqli-lab靶场学习(七)——Less23-25(关键字被过滤、二次注入)

前言 之前的每一关&#xff0c;我们都是在末尾加上注释符&#xff0c;屏蔽后面的语句&#xff0c;这样我们只要闭合了区间之后&#xff0c;差不多就是为所欲为的状态。但如果注释符不生效的情况下&#xff0c;又该如何呢&#xff1f; Less23&#xff08;注释符被过滤&#xff…...

虚函数和虚表的原理是什么?

虚函数是一个使用virtual关键字声明的成员函数&#xff0c;在基类中声明虚函数&#xff0c;在子类中可以使用override重写该函数。虚函数根据指针或引用指向的实际对象调用&#xff0c;实现运行时的多态。 虚函数表&#xff08;虚表&#xff09;是一个用于存储虚函数地址的数组…...

RReadWriteLock读写锁应用场景

背景 操作涉及一批数据&#xff0c;如订单&#xff0c;可能存在多个场景下操作&#xff0c;先使用读锁&#xff0c;从redis缓存中获取操作中数据 比如 关闭账单&#xff0c; 发起调账&#xff0c; 线下结算&#xff0c; 合并支付 先判断当前操作的数据&#xff0c;是否在…...

【面试】MySQL

MySQL 1、数据库三范式2、什么是关系型数据库&#xff0c;什么是非关系型数据库3、什么是数据库存储引擎4、MySQL5.x和8.0有什么区别5、char 和 varchar 的区别6、in 和 exists 的区别7、MySQL 时间类型数据存储建议8、drop、delete 与 truncate 区别9、一条 Sql 的执行顺序10、…...

Trae AI 开发工具使用手册

这篇手册将介绍 Trae 的基本功能、安装步骤以及使用方法&#xff0c;帮助开发者快速上手这款工具。 Trae AI 开发工具使用手册 Trae 是字节跳动于 2025 年推出的一款 AI 原生集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在通过智能代码生成、上下文理解和自动化任务…...

表格columns拼接两个后端返回的字段(以umi框架为例)

在用组件对前端项目进行开发时&#xff0c;我们会遇到以下情况&#xff1a;项目原型中有取值范围这个表字段&#xff0c;需要存放最小取值到最大取值。 而后端返回给我们的数据是返回了一个最小值和一个最大值&#xff0c; 在columns中我们需要对这两个字段进行拼接&#xff0…...

常见的算法题python

字符串倒序 def func1(str):return str[::-1] def func2(str):new_str ""for i in str:new_str inew_strreturn new_str if __name____main__:str"linda"print(func2(str))合并两个有序的列表 def func3(list1,list2):for i in list1:list2.append(i)li…...

linux学习(十)(磁盘和文件系统(索引节点,文件系统,添加磁盘,交换,LVM公司,挂载))

Linux 磁盘文件系统 Linux 使用各种文件系统来允许我们从计算机系统的硬件&#xff08;例如磁盘&#xff09;存储和检索数据。文件系统定义了如何在这些存储设备上组织、存储和检索数据。流行的 Linux 文件系统示例包括 EXT4、FAT32、NTFS 和 Btrfs。 每个文件系统都有自己的…...

k8s v1.28.15部署(kubeadm方式)

k8s部署&#xff08;kubeadm方式&#xff09; 部署环境及版本 系统版本&#xff1a;CentOS Linux release 7.9.2009 k8s版本&#xff1a;v1.28.15 docker版本&#xff1a;26.1.4 containerd版本&#xff1a;1.6.33 calico版本&#xff1a;v3.25.0准备 主机ip主机名角色配置1…...

Python开发Scikit-learn面试题及参考答案

目录 如何用 SimpleImputer 处理数据集中的缺失值? 使用 StandardScaler 对数据进行标准化的原理是什么?与 MinMaxScaler 有何区别? 如何用 OneHotEncoder 对类别型特征进行编码? 解释特征选择中 SelectKBest 与 VarianceThreshold 的应用场景。 如何通过 PolynomialFe…...

Java在小米SU7 Ultra汽车中的技术赋能

目录 一、智能驾驶“大脑”与实时数据 场景一&#xff1a;海量数据的分布式计算 场景二&#xff1a;实时决策的毫秒级响应 场景三&#xff1a;弹性扩展与容错机制 技术隐喻&#xff1a; 二、车载信息系统&#xff08;IVI&#xff09;的交互 场景一&#xff1a;Android Automo…...

蓝队第三次

1.了解什么是盲注 盲注&#xff08;Blind SQL Injection&#xff09;是SQL注入的一种形式&#xff0c;攻击者无法直接通过页面回显或错误信息获取数据&#xff0c;而是通过观察页面的布尔状态&#xff08;真/假&#xff09;或时间延迟来间接推断数据库信息。例如&#xff0c;通…...

Element Plus中的树组件的具体用法(持续更新!)

const defaultProps {//子树为节点对象的childrenchildren: children,//节点标签为节点对象的name属性label: name, } 属性 以下是树组件中的常用属性以及作用&#xff1a; data&#xff1a;展示的数据&#xff08;数据源&#xff09; show-checkbox&#xff1a;节点是否可…...

nodejs使用WebSocket实现聊天效果

在nodejs中使用WebSocket实现聊天效果&#xff08;简易实现&#xff09; 安装 npm i ws 实现 创建 server.js /*** 创建一个 WebSocket 服务器&#xff0c;监听指定端口&#xff0c;并处理客户端连接和消息。** param {Object} WebSocket - 引入的 WebSocket 模块&#xff0c…...

通领科技冲刺北交所

高质量增长奔赴产业新征程 日前&#xff0c;通领科技已正式启动在北交所的 IPO 进程&#xff0c;期望借助资本市场的力量&#xff0c;加速技术升级&#xff0c;推动全球化战略布局。这一举措不仅展现了中国汽车零部件企业的强大实力&#xff0c;也预示着行业转型升级的新突破。…...

利用LLMs准确预测旋转机械(如轴承)的剩余使用寿命(RUL)

研究背景 研究问题:如何准确预测旋转机械(如轴承)的剩余使用寿命(RUL),这对于设备可靠性和减少工业系统中的意外故障至关重要。研究难点:该问题的研究难点包括:训练和测试阶段数据分布不一致、长期RUL预测的泛化能力有限。相关工作:现有工作主要包括基于模型的方法、数…...

comctl32!ListView_OnSetItem函数分析LISTSUBITEM结构中的image表示图标位置

第一部分&#xff1a; BOOL ListView_SetSubItem(LV* plv, const LV_ITEM* plvi) { LISTSUBITEM lsi; BOOL fChanged FALSE; int i; int idpa; HDPA hdpa; if (plvi->mask & ~(LVIF_DI_SETITEM | LVIF_TEXT | LVIF_IMAGE | LVIF_STATE)) { …...

Django工程获取请求参数的几种方式

在 Django 中获取请求参数的完整方法如下&#xff1a; 一、GET 请求参数获取 def view_func(request):# 获取单个参数&#xff08;推荐方式&#xff09;name request.GET.get(name, default) # 带默认值age request.GET.get(age, 0)# 获取多个同名参数&#xff08;如复选框…...

使用Qt调用HslCommunication(C++调用C#库)

使用C/CLI 来调用C#的dll 任务分解&#xff1a; 1、实现C#封装一个调用hsl的dll&#xff1b; 2、实现C控制台调用C#的dll库&#xff1b; 3、把调用C#的dll用C再封装为一个dll&#xff1b; 4、最后再用Qt调用c的dll&#xff1b; 填坑&#xff1a; 1、开发时VS需要安装CLI项目库…...

C++中的构造函数

目录 一、什么是构造函数&#xff1a; 二、构造函数的特性和使用&#xff1a; 1、构造函数的特性&#xff1a; 2、构造函数的重载&#xff1a; 三、默认生成的构造函数&#xff1a; 一、什么是构造函数&#xff1a; 在C中&#xff0c;当创建一个对象之后&#xff0c;就会自…...

MySQL知识点(第一部分)

MySQL 基础&#xff1a; 1、SQL语句的分类&#xff1a; DDL&#xff1a;用于控制数据库的操作DML&#xff1a;用于控制表结构的字段&#xff0c;增、删、修DQL&#xff1a;用于查询语句DCL&#xff1a;用于管理数据库&#xff0c;用户&#xff0c;数据库的访问 权限。 2、M…...

Lua怎么学?Lua编程实战:从基础语法到高级特性

朋友们&#xff0c;大家好&#xff0c;我是袁庭新。我的《Lua编程实战&#xff1a;从基础语法到高级特性》教程上线了&#xff01;这是一套从零掌握Lua编程&#xff0c;涵盖基础到高级&#xff0c;以实战驱动&#xff0c;快速上手Lua开发的精品教程&#xff01; 我为什么要研发…...

Qt常用控件之 纵向列表QListWidget

纵向列表QListWidget QListWidget 是一个纵向列表控件。 QListWidget属性 属性说明currentRow当前被选中的是第几行。count一共有多少行。sortingEnabled是否允许排序。isWrapping是否允许换行。itemAlignment元素的对齐方式。selectRectVisible被选中的元素矩形是否可见。s…...

Manus无需邀请码即可使用的平替方案-OpenManus实测

文章目录 Manus 简介核心定位技术架构核心特点应用场景性能表现用户体验发展计划OpenManus技术架构与设计理念核心功能特性应用场景案例与闭源Manus的差异对比安装使用与实战演示执行过程记录简单案例-快速写一个helloworld的java程序复杂案例-分析特斯拉汽车近三年财务数据并生…...

git如何解除远程仓库 改变远程仓库地址

这三个命令通常一起使用来更改项目的远程仓库地址&#xff1a; 查看当前远程仓库配置&#xff1a;git remote -v移除旧的远程仓库配置&#xff1a;git remote remove origin添加新的远程仓库配置&#xff1a;git remote add origin 新的远程仓库地址 要解除当前项目的远程仓库…...

VSCode 配置优化指南:打造高效的 uni-app、Vue2/3、JS/TS 开发环境

VSCode 配置优化指南,适用于 uni-app、Vue2、Vue3、JavaScript、TypeScript 开发,包括插件推荐、设置优化、代码片段、调试配置等,确保你的开发体验更加流畅高效。 1. 安装 VSCode 如果你还未安装 VSCode,可前往 VSCode 官网 下载最新版并安装。 2. 安装推荐插件 (1) Vue…...

云计算:虚拟化、容器化与云存储技术详解

在上一篇中,我们深入探讨了网络安全的核心技术,包括加密、认证和防火墙,并通过实际案例和细节帮助读者全面理解这些技术的应用和重要性。今天,我们将转向一个近年来迅速发展的领域——云计算。云计算通过提供按需访问的计算资源,彻底改变了IT基础设施的构建和管理方式。本…...

oracle 数据导出方案

工作中有遇到需要将oracle 数据库表全部导出&#xff0c;还需要去除表数据中的换行符。 方案 shell 设计 封装函数 1 function con_oracle() 用于连接oracle 2 function send_file() 用于发送文件 3 主程序 使用循环将所有表导出并发送到数据服务器 主程序 程序代码 #!…...

电商项目-秒杀系统(四)秒杀异步下单防止重复秒杀

一、 防止恶意刷单解决 在生产场景下&#xff0c;可能会有一些人会恶意访问当前网站&#xff0c;来进行恶意的刷单。这样会造成当前系统出现一些业务上的业务混乱&#xff0c;出现脏数据&#xff0c;或者造成后端访问压力大等问题。 一般要解决这个问题的话&#xff0c;前端可…...

Express 中 get 参数获取

1. 使用 req.query 获取 URL 查询字符串参数 在 GET 请求中&#xff0c;参数通常以查询字符串的形式附加在 URL 后面&#xff0c;格式为 ?参数名1值1&参数名2值2 。Express 里可通过 req.query 对象获取这些参数。 const express require("express"); const …...

《Python实战进阶》No17: 数据库连接与 ORM(SQLAlchemy 实战)

No17: 数据库连接与 ORM&#xff08;SQLAlchemy 实战&#xff09; 摘要 本文深入探讨SQLAlchemy在复杂场景下的高级应用&#xff0c;涵盖四大核心主题&#xff1a; 会话生命周期管理&#xff1a;通过事件钩子实现事务监控与审计追踪混合继承映射&#xff1a;结合单表/连接表继…...

运行OpenManus项目(使用Conda)

部署本项目需要具备一定的基础&#xff1a;Linux基础、需要安装好Anaconda/Miniforge&#xff08;Python可以不装好&#xff0c;直接新建虚拟环境的时候装好即可&#xff09;&#xff0c;如果不装Anaconda或者Miniforge&#xff0c;只装过Python&#xff0c;需要确保Python是3.…...

Linux一键美化命令行,一键安装zsh终端插件

zsh应该是很多人第一个用的Linux终端美化软件 但是其安装略微复杂&#xff0c;让人有些困扰 所以我花了两天写了一键安装脚本&#xff0c;实测运行后直接安装好 适用于Ubuntu、Debian、Red Hat、macOS等系统 直接安装好zsh 以及常用插件 autojump 跳转插件 zsh-syntax-highlig…...

OpenManus介绍及本地部署体验

1.OpenManus介绍 OpenManus&#xff0c;由 MetaGPT 团队精心打造的开源项目&#xff0c;于2025年3月发布。它致力于模仿并改进 Manus 这一封闭式商业 AI Agent 的核心功能&#xff0c;为用户提供无需邀请码、可本地化部署的智能体解决方案。换句话说&#xff0c;OpenManus 就像…...

2025-03-09 学习记录--C/C++-PTA 习题10-7 十进制转换二进制

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 裁判测试程序样例&#xff1a; #include <stdio.h>void dectobin( int n );int main() {int n;scanf(…...

计算机网络----主要内容简介

这里写目录标题 章节概览每章的大体结构结构功能与服务的关系 一些概念概念一概念二传统的网络层的工作方式&#xff08;路由IP&#xff09;现代的网络层的工作方式&#xff08;SDN&#xff09; 章节概览 其中&#xff0c;网络层分为了两章 下面的红色部分是部分选修 每章的大…...

基于python大数据的招聘数据可视化与推荐系统

博主介绍&#xff1a;资深开发工程师&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有…...

VBA高级应用30例Excel中ListObject对象:提取表内单元格的格式元素

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…...

数据结构基础之《(19)—矩阵处理》

一、zigzag打印矩阵 Z字形打印矩阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 打印顺序&#xff1a;1,2,7,13,8,3,4,9,14... 核心技巧&#xff1a;找到coding上的宏观调度 左上角有A、B两个点&#xff0c;A往右一步一步走&#xff0c;B往下一步一步走 写一个…...

用Python写一个算24点的小程序

一、运行界面 二、显示答案——递归介绍 工作流程&#xff1a; 1. 基本情况&#xff1a;函数首先检查输入的数字列表 nums 的长度。如果列表中只剩下一个数字&#xff0c;它会判断这个数字是否接近 24&#xff08;使用 abs(nums[0] - 24) < 1e-10 来处理浮点数精度问题&…...

基于深度学习的网络摄像头图像实时分类实践:从理论到完整实现

引言&#xff1a;智能视觉感知的新可能 在人工智能技术蓬勃发展的今天&#xff0c;实时图像分类作为计算机视觉的基础任务之一&#xff0c;正在深刻改变着我们的生活。从智能手机的人脸解锁到无人超市的自动结算系统&#xff0c;从工业质检的缺陷检测到医疗影像的辅助诊断&…...

C++ 算法竞赛STL以及常见模板

目录 STL /*═══════════════ Vector ═══════════════*/ /*════════════════ Pair ════════════════*/ /*══════════════ String ════════════════*/ /*══════════…...

【资料分享】wireshark解析脚本omci.lua文件20250306版本发布(独家分享)

引言 omci.lua文件是Wireshark的OMCI协议解析插件的核心组件。它配合BinDecHex.lua&#xff0c;可以解析OMCI协议的数据包&#xff0c;提取出消息类型、受管实体标识、受管实体属性等关键信息&#xff0c;并以人类可读的形式显示在Wireshark的解码视图中&#xff0c;方便研发人…...

(dfs 单词搜索)leetcode 79

核心思路 用双重循环以所有的位置都作为起始点开始遍历 设置边界条件 上下左右都搜一次&#xff0c;不合适就回来&#xff0c;二叉树思想 经过的结点设置"#避免重复搜索导致数据混乱 递归完后要还原原字符 #include<iostream> #include<vector> #include&l…...

Java常用集合与映射的线程安全问题深度解析

Java常用集合与映射的线程安全问题深度解析 一、线程安全基础认知 在并发编程环境下&#xff0c;当多个线程同时操作同一集合对象时&#xff0c;若未采取同步措施&#xff0c;可能导致以下典型问题&#xff1a; 数据竞争&#xff1a;多个线程同时修改数据导致结果不可预测状…...