【JAVA ee初阶】多线程(3)
一、出现线程安全的原因
1.【根本原因】线程的调度执行时随机的(抢占式执行)->罪魁祸首
2.多个线程同时修改同一个变量
如果是一个线程修改一个变量 或者 多个线程读取同一个变量 或者 多个线程修改不同变量 这些都没事。
3.修改操作不是原子的!
像count++ 这样的修改,就是不是原子的修改。
但是像 = 这样的修改,就是属于原子的。(在Java针对内置类型进行 = ,或者针对引用 = 都是原子的)(*但是,在C++中就不一定了,还是不是原子的,就得具体问题具体分析了)
后序判定某个代码是否是线程安全的,需要结合这几点一起来判定。
*如果将全局变量count放入到main方法当中,就会出现报错。
把变量改成局部变量,编译直接过不了了:lambda表达式要想正确捕获变量,要求是final或者事实final(虽然没有加final关键字,但是代码中确实也没人修改)
写成成员变量在lambda中确实能够使用,此时不是走“变量捕获”语法,而是“内部类访问外部类成员”,本身就ok。
lambda本质上就是匿名 内部类(函数式接口)
内部类访问外部类成员,本来就可以实现。
*扩展String
String是不可变对象,new好一个String对象本身就是不能修改的。设计成不可变对象,其中有一个理由,就是不可变对象天然就是线程安全的。
不可变对象,方便放到常量池中进行缓存。不可变对象,hasCode是固定值,也方便和哈希表进行结合,作为hash的Key
StringBuffer本身确实修改了,但是又通过其他路径(例如枷锁)解决线程安全问题。
StringBuilder是彻底的线程不安全。
*什么是原子的?一个事物是原子的,说明他就是不可拆分的最小单位。SQL中,事务就是把多个SQL打包成一个整体,执行的时候,要么全都执行完,要么一个都不执行。就不会出现执行一半的情况,这就成为原子性。
此处谈到的原子也是类似的含义,CPU执行指令的角度,如果是一条指令,对于CPU来说,要么就是执行完,要么就是不执行,不会出现“一个指令执行一般”这样的情况。CPU执行一条指令,这个行为就是原子的。
像count++这样的指令,对应到多条CPU指令,CPU执行过程中就可能执行一半,就调度走执行别人的指令了(这就不是原子的)
=这样的操作,也是对应到一条CPU指令(类似于MOVE)
那么如何将这些操作变为线程安全的呢?
核心思路:把修改操作变成原子的。
通过锁来实现。
关键字:synchronized通过这个关键字来实现使用锁。
对于锁这样的概念,涉及到两个核心操作:
1.加锁
2.解锁
Java就通过这一个关键字来表示这两种操作,进来就是加锁,出去就是解锁。sychronized()的()里面填写的是“锁对象”,真正用来枷锁的锁是谁?——>在Java中,任何一个对象都可以用来作为锁对象(引用类型,不能是内置类型)
加锁,就是把若干个操作“打包成一个原子”。不是说把这count++的三个指令变成一个指令了。也不是说,这三个指令就必须要一口气在cpu上执行完,不会触发调度。加锁会影响到其他的加锁线程,而且是加同一个锁的线程。
当两个线程,尝试竞争同一把锁,才会产生“阻塞”,如果是竞争不同的锁,就没有影响。
sychronized(锁对象),看锁对象是不是同一个对象。
锁竞争(Lock Contention)是指多个线程试图同时访问同一个临界区(即需要互斥访问的代码区域),因此它们之间产生了竞争。在任意时刻,只能有一个线程持有锁并进入临界区,其他试图进入临界区的线程必须等待。
如果是两个线程,一个加锁了另一个么有加锁,这样就不会产生阻塞。两个线程都加锁了,而且是同一个对象,才会产生锁竞争。
此处的加锁和解锁,也可以视为两个cpu指令。这两个操作使得这两个线程各自循环执行5w次。
整个程序按照如图所示的流程进行:
本来load add save 在两个线程中是穿插执行的,但是在引入锁之后,就变成了“串行执行”,不再穿插,最后输出结果也自然是1w次。
*要是两个锁对象不一样:不一样就不会产生阻塞,程序的执行也就不会出现上述的“禁止插队”这样的行为。
这里又一系列很复杂的逻辑
这里也有一系列很复杂的逻辑
日常工作中,一般都是让加锁范围尽量的小
这样的话,可以并发执行的逻辑就更多,此时外部的逻辑通常是更复杂的。
此时这张图中,只有count++是串行的。
引入多线程,就是为了并发执行,就是为了充分利用cpu多核心资源。
多进程编程 和 多线程编程 就是在利用多核心的编程手法。
t1如果加上锁,t1就会不停地执行循环,直到把5w次都执行完,才会去释放锁。
t2只能阻塞等待,一直等到t1释放锁(t1的5w次循环都执行完了),t2才能继续执行
此时,这两个线程的循环时完全串行的,(也就是和一个线程执行是类似的了),这种写法,两个代码是完全串行化。
此时,并没有把多核心利用起来。
这种写法,在当前代码下,执行速度反而更快,主要是因为当前的任务很简单。
*这种情况下,t1和t2谁先拿到锁?
结论没有唯一性,假设t1先拿到锁,当t1循环完毕一次,下一次加锁可能是t1继续加上,也可能是t2加上(这里体现了随机调度)。类似于“数据库隔离级别”,隔离级别越高,并发程度越低,执行速度越慢。
synchronized使用方法
1.synchronized(锁对象){}
基础使用,常见使用。不是禁止调度,而是禁止其他线程插队。
2.修饰一个普通方法,就可以省略锁对象:
*此时,相当于针对this加锁,不是没有锁对象,而是把锁对象给省略掉了
等价于
上面这两种写法,实际上没有任何区别。锁对象,是啥对象不重要,重要的是,两个线程是否是针对同一个对象加锁。
3.synchronized修饰静态方法
此时认为synchronized是针对类对象进行加锁的
static修饰的方法,也叫做“类方法”,不是针对“实例”的方法,而是针对类的。在这个方法里,没有this。
Counter.class——>反射 程序运行时,能够拿到类/对象的一些相关属性。(这个类有哪些成员,都叫啥名字,都是啥类型,都是private/public,有啥方法,都叫啥名,参数列表是啥,是private/public,这个类继承的父类是谁,上实现了哪些interface.......)
通过类对象拿到上述信息。(*不考虑运行,看下代码就行,强调“运行时”的意思就是,不让你看代码,也能够获取到这里的信息)
.java编译生成.class
.class被jvm加载到内存中,就得到了对应的“类对象”。
synchronized的特性
1.互斥性(前文已经提及)
2.可重入
如果一个线程,针对一把锁,连续加锁两次会发生死锁(deadlock)。(如图所示)
分析:初始情况下,假定locker是未加锁的状态,此时的synchronized就会加锁成功,继续向下执行。
第二次加锁的时候,这个锁已经是“被加锁”的状态了,如果这个锁已经被加锁了,尝试加锁操作,就会触发锁冲突/锁竞争,此时该线程就会阻塞等待,一直等到锁被释放。
走到第二个加锁的位置,触发阻塞,如何解除阻塞?得先释放第一个锁,如何释放第一个锁,得先把第二个锁加上,往下继续走。
BLOCKED状态不是“死锁”,而是因为锁产生的阻塞,这里所说的死锁指的是这个锁再也解不开了。
有的时候,死锁的现象不是特别明显,稍有不慎就会发生死锁现象。
但是,java中引入了可重入机制,有效地避免了上述的死锁情况。(注意,死锁有很多种体现形式,可重入只是能解决一个线程一把锁,加锁两次的情况,解决不了其他情况)同一个线程,针对同一把锁,连续加锁多次,不会触发死锁,此时这个锁就可以称为“可重入锁”。
相关文章:
【JAVA ee初阶】多线程(3)
一、出现线程安全的原因 1.【根本原因】线程的调度执行时随机的(抢占式执行)->罪魁祸首 2.多个线程同时修改同一个变量 如果是一个线程修改一个变量 或者 多个线程读取同一个变量 或者 多个线程修改不同变量 这些都没事。 3.修改操作不是原子的&a…...
【Java ee初阶】多线程(4)
一、java是怎么做到可重入的 java中,通过synchronized进行加锁,指定一个()包含了一个锁对象。(锁对象本身是一个啥样的对象,这并不重要,重点关注锁对象是不是同一个对象) 后面搭配…...
Day15(贪心算法)——LeetCode121.买卖股票的最佳时机55.跳跃游戏
1 LeetCode121.买卖股票的最佳时机(LeetCode121) 1.1 题目描述 题目描述如下: 示例如下: 1.2 问题分析及解决 要求最大利润,即当天与之前天的价格之差最大值。因此我们可以遍历数组,记录下当前遇到的最小值,然后用当天的价…...
2025汽车制造企业数字化转型路径参考
以应用场景作为切入点,引导相关企业推进数字化深度转型和规模化改造,是目前实践探索出来的一条可行路径。 汽车制造行业是相对集聚的制造业领域,通过搭建“转型场景图谱——转型通用工具——转型路径指引”分析框架,聚焦需求侧共…...
雷池WAF的身份认证 - GitHub
雷池支持通过 GitHub 认证的方式,让用户使用 GitHub 身份安全登录应用或网站。使用此功能需要 GitHub 账号 。 第一步:在 GitHub 创建一个 OAuth 应用 可参阅 GitHub 官方文档,创建一个 GitHub OAuth 应用,并获取应用的 ClientI…...
【Linux】第十二章 安装和更新软件包
目录 1. 什么是RPM? 2. dnf是什么,它和rpm有什么联系和区别? 3. RHEL 中如何做才能启用对第三方存储库的支持? 4. 怎么理解RHEL9中的应用流(Application Streams)和模块(Modules)? 5. RHEL9 有两个必要的软件存储…...
【权限模型】RBAC模型详解
大家好,我是jstart千语。今天给大家介绍一下鉴权模型RBAC,传统的鉴权模式就是基于用户和权限之间的多对多关系。而RBAC就更加的精准,更好管理。 RBAC介绍 RBAC(Role-Based Access Control)是一种通过角色(…...
tree命令
tree [选项] [目录...] 指定要显示的目录。如果没有指定目录,tree 会显示当前目录及其子目录结构。 常用选项 -a 显示所有文件和目录,包括隐藏文件(以 . 开头的文件)。 -d 只显示目录,不显示文件。 -L LEVEL …...
【Vue.js】组件数据通信:基于Props 实现父组件→子组件传递数据(最基础案例)
概览 前言父子通信流程关键技术点关键规则 实战1. 在父组件中注册子组件2. 子组件接收父组件传入的数据补充与总结 前言 在 Vue 3 中,父组件向子组件传递数据是通过props实现的。父组件在子组件的标签上绑定数据,子组件通过定义props接收这些数据。这种…...
信创时代技术栈选择与前景分析:国产替代背景下的战略路径与实践指南
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
Python内置方法干货总结
如果你还在为提升Python代码能力发愁,那么掌握内置方法就是你的捷径!很多初学者和进阶者忽略了这一“宝藏”,其实,Python的内置方法不仅能让你代码更简洁,还能大幅提升开发效率。今天,咱们就来一次系统梳理…...
小草GrassRouter多卡聚合路由器聚合卫星、MESH网络应用解决方案
一、多网融合解决方案 卫星网络融合 支持接入卫星通信模块,在无地面网络覆盖的极端场景(如偏远山区、海洋救援)下,形成“5G卫星”双链路冗余传输,卫星链路可作为核心通信备份,确保关键指令和视频数据实…...
Spring反射机制
Spring反射机制 反射机制是加载类时,在运行时动态地获取类的信息,并且可以操作类或对象的属性、方法、构造函数等成员的能力。在 Java 里,反射机制的实现主要依赖于 java.lang.reflect 包下的多个类,以及 java.lang 包中的 Class…...
PCB硬件电路设计_pcb布线设计
1.MCU最小系统电路 这些电路都会非常接近MCU,他们的可靠性决定了MCU能否正常工作。 外围电路,为了布线整齐美观,尽量避免打过多的通孔。在布局的时候走线的顺序和元器件顺序尽可能的保持一直避免走线交叉。 2.晶振电路布线 一般情况下我们…...
Qt开发:XML文件的写入与读取
文章目录 一、使用 QDomDocument操作节点1.1 将信息写入XML文件中1.2.从XML文件中读取信息 二、使用 QXmlStreamWriter操作节点2.1 将信息写入XML文件中2.2 从XML文件中读取信息 三、总结 一、使用 QDomDocument操作节点 1.1 将信息写入XML文件中 #include <QDomDocument&…...
PCI/PXI 总线的可编程电阻卡
701X 系列是阿尔泰科技基于 PCI/PXI 总线的可编程电阻卡,多种电阻范围可选,稳定性好;准确 度低至 0.2%;分辨率设置精细,可低至 0.125Ω,适用于传感器仿真应用。 701X 系列高精度程控电阻模块具有高设置分辨…...
火语言RPA--腾讯云存储
【组件功能】:存储本地文件至腾讯云 选择本地文件,通过腾讯云存储配置上传至腾讯云对象存储的指定地域指定存储桶指定路径。 配置预览 配置说明 SecretId 支持T或# 前往官网获取或创建。参考链接:https://console.cloud.tencent.com/cam/…...
使用POI和EasyExcel使用导入
1.使用POI导入 1.1导入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency> 1.2创建工具类 package com.ruoyi.common.utils.poi;import org.ap…...
AWS PrivateLink vs Lattice:深度解析两大网络服务的异同
导语: 在AWS的网络服务生态中,PrivateLink和Lattice都是备受关注的解决方案。本文将深入探讨这两项服务的核心特性、应用场景以及它们之间的关键区别,帮助您在复杂的网络架构设计中做出明智的选择。 一、AWS PrivateLink 概述 定义 AWS PrivateLink 是一种网络服务,允许您…...
Linux系统编程---exec簇:进程的加载与替换
1、exec簇基础 在Linux中,用于加载并执行指定程序的API有exec簇和system函数。 exec簇的进程替换不会创建一个新的进程,只是加载新的程序代码和数据,替换当前进程执行的程序代码。 system函数的进程替换是创建一个新的子进程,然后…...
C++ 之 【模拟实现 list(节点、迭代器、常见接口)】(将三个模板放在同一个命名空间就实现 list 啦)
1.前提准备 (1) list 的底层结构一般是带头双向循环链表 (1)为避免命名冲突,需要创建一个命名空间来存放模拟实现的 list (2)下面模拟实现list时,声明和定义不分离(具体原因后续讲解) 2.完整实现 2.1 链表节点 template<class T>//节点写成类模板…...
数字图像处理 -- 眼底图像血管分割方法
算法框架 基于深度学习的 U-Net 架构,结合注意力机制(Attention Gate)与多尺度特征提取,以提高细小血管的检测能力。整体流程如下: 输入图像预处理:提取绿色通道 & CLAHE 增强数据增强:旋…...
基于ffmpeg的音视频编码
1 音频编码 本质上是由pcm文件转到一个协议文件 比如说aac协议 1.1 音频基本知识回归 比特率 比特率是指单位时间内传输或处理的比特(bit)数量,通常用 bps(bits per second,比特每秒)来表示。它是衡量数…...
Android wifi开发调试总结
Android wifi开发调试简单总结 文章目录 Android wifi开发调试简单总结一、前言二、wifi demo开发1、开关和连接2、wifi开启主要流程3 、wifi主要广播4、相关日志5、demo示例 三、其他1、Wifi开发小结2、其他wifi知识小结(1)Android无线Wifi开发…...
LLVIP、KAIST、M3FD数据集
LLVIP、KAIST、M3FD数据集 (可见光红外,双模态数据集,已配准已对齐已清洗,已处理为txt格式,YOLO可直接训练) 电子产品,一经出售,概不退换 算法设计、毕业设计、期刊专利!…...
datasets 数据处理封装后,统一处理流程以避免Dataset Map顺序依赖问题
文章目录 处理流程说明小结 在实际项目中,我们常常需要对数据集进行预处理。为了规范操作,我封装了一个基础数据集处理类: class DatasetAbstract:"""所有数据集都应包含以下几个字段:* question:用户…...
【学习笔记】机器学习(Machine Learning) | 第四章(3)| 多变量线性回归
机器学习(Machine Learning) 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习(Machine Learning)简要声明 三、特征工程与多项式回归(一)特征工程:从数据中发…...
将本地Springboot项目部署到Linux服务器
1、打包后端项目 在IDEA的终端上执行命令 mvn clean package "-Dmaven.test.skiptrue" 在target目录下查看jar包是否存在 2、idea运行jar包(可选) 在IDEA的终端上执行命令 # 进入jar包所在目录 E:\LzpWorkspaces\lzp-records> cd .\tar…...
无人设备遥控器之实时数据保护技术篇
无人设备遥控器的实时数据保护技术是保障设备安全运行、避免信息泄露或恶意干扰的核心手段,其核心目标是在复杂电磁环境和网络攻击威胁下,确保指令传输的完整性、保密性和抗干扰性。 一、技术实现路径 链路层加密与认证 动态密钥协商:采用…...
【优秀三方库研读】【性能优化点滴】odygrd/quill 解决伪共享
一、伪共享(False Sharing)问题本质 当不同CPU核心频繁修改**同一缓存行(Cache Line)**中的不同变量时,会导致严重的性能下降。现代CPU的缓存系统以缓存行(通常64字节)为单位操作内存ÿ…...
JavaScript性能优化实战(6):网络请求与资源加载优化
引言 在现代Web应用开发中,网络性能已成为影响用户体验的关键因素。据统计,用户等待页面加载的耐心通常不超过3秒,超过这个时间,约40%的用户会选择离开。此外,Google的研究表明,页面加载时间每增加0.5秒,流量就会下降约20%。因此,优化网络请求和资源加载不仅关乎用户体…...
re题(49)BUUCTF-crackMe
BUUCTF在线评测 int wmain() {FILE *v0; // eaxFILE *v1; // eaxchar v3; // [esp3h] [ebp-405h]char v4[256]; // [esp4h] [ebp-404h] BYREFchar Format[256]; // [esp104h] [ebp-304h] BYREFchar v6[256]; // [esp204h] [ebp-204h] BYREFchar v7[256]; // [esp304h] [ebp-10…...
Python中的单例模式:深入探索元类与装饰器实现
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 单例模式(Singleton Pattern)是设计模式中的一种重要模式,确保一个类在整个应用中只有一个实例,并且提供全局访问点。Python语言作为一…...
深入解析 Babylon.js 中的 TransformNode.lookAt 方法
在 3D 开发中,控制对象朝向是一个基础但关键的需求。Babylon.js 作为一款强大的 Web3D 引擎,提供了 TransformNode.lookAt 方法来实现这一功能。本文将全面解析这个方法的使用技巧、参数含义以及常见应用场景。 方法基础 TransformNode.lookAt 的基本签…...
SpringCloud组件——Gateway
一.网关 1.问题提出 我们通过Eureka,Nacos解决了服务注册,服务发现的问题,使用SpringCloud LoadBalance解决了负载均衡的问题,使用OpenFeign解决了远程调用的问题。 但是当前所有微服务的接口都是直接对外暴露的,可…...
Boost 库安装 (windows 11)
Boost 库安装 (windows 11 1 下载2 生成3 使用 1 下载 下载地址:https://www.boost.org/ 有的时候会需要历史版本下载: https://www.boost.org/users/history/ 2 生成 1、解压后点击 bootstrap.bat,会生成可执行程序b2.exe 2、双击运行b2.…...
lmms-eval--微调实战笔记
lmms-eval--大模型调用平台,方便新手上手大模型微调 lmms-eval的更多用法,没有mathversehttps://github.com/EleutherAI/lm-evaluation-harness.git 单卡运行,模型gpt-j-6B,数据集hellaswag git clone --depth 1 https://github.com/Eleuthe…...
序列密码算法ShanLooog512设计原理详解
序列密码算法ShanLooog512设计原理详解 ShanLooog512(闪龙512)为序列密码算法,内部状态为512比特,密钥长度为128或256比特,轮函数为FFFFFFFF,循环轮数为24轮,输出密钥流为512比特的状态。与Salsa20类似,内…...
Matplotlib可视化基础
1. 折线图 matplotlib.pyplot.plot() # 主要参数: x,y -- 接收array,表示X轴和Y轴对应的数据,无默认 color -- 接收特定string,指定线条的颜色,默认为None linestyle -- 接收特定string,指定线条的类型…...
Linux 内核网络协议栈中的关键数据结构:inet_skb_parm 与 ip_options
在 Linux 内核的网络协议栈中,数据包的高效处理依赖于一系列精心设计的数据结构。这些结构体不仅需要存储网络数据的元信息,还需支持复杂的协议逻辑(如路由、分片、安全策略等)。本文聚焦两个核心结构体 struct inet_skb_parm 和 struct ip_options,解析它们的设计原理、功…...
oracle 数据库查询指定用户下每个表占用空间的大小,倒序显示
oracle 查询指定用户下每个表占用空间的大小,倒序显示 使用场景:数据分析;导出医院正式库到开发环境时,查询出占用表空间高的业务表、导出时排除该表 在Oracle数据库中,要查询指定用户下每个表占用空间的大小并以倒序…...
Missashe考研日记-day29
Missashe考研日记-day29 1 专业课408 学习时间:3h学习内容: 今天先是把虚拟存储剩余的课听完了,然后就是做课后选择题,57道,已经接受了OS课后题尤其多的事实了。解决并且理解完习题之后就开始预习文件管理的内容&…...
【AI】【MCP】搭建私人王炸MCP自动化工作流
目录 一、什么是MCP 二、MCP大集合 三、准备工作 3.1 安装node.js 3.2 安装vscode 3.3 安装cline插件 3.3.1 安装 3.3.2 配置Cline 四、配置MCP服务 4.1 Search-mcp服务 4.2 playwright-mcp 服务 前言:梦想组合,轻松办公,告别手动&a…...
多元函数微分之传统方法和全微分法
一、传统方法 使用链式法则,先对中间变量(如 u,v)求偏导,再乘以中间变量对最终变量(如 x,y)的偏导。 二、全微分法 基于全微分形式不变性,直接对 zf(u,v) 求全微分 dz,再代入 du 和…...
新手SEO基础优化全解析
内容概要 对于刚接触SEO的新手而言,系统化理解优化逻辑是避免无效操作的关键。本文将从基础概念入手,逐步拆解搜索引擎排名的影响要素,围绕关键词分析、技术优化、内容策略三大核心模块,提供可落地的操作框架。通过结合工具使用说…...
MATLAB退火算法和遗传算法解决旅行商问题
模拟退火算法和遗传算法都是常用于解决旅行商问题(TSP)的优化算法,它们在原理、搜索方式、收敛速度和适用场景等方面存在一些区别: 原理 模拟退火算法:模拟退火算法的灵感来源于固体退火原理。固体在加热后缓慢冷却时…...
喜马拉雅卖身腾讯音乐:在线音频独立时代的终结
坦白说,这条消息一出来,喜马拉雅被卖掉不太奇怪,但是腾讯音乐会收购,还是有点意外。 喜马拉雅之前一度被称为中国版Audible平台,在过去几年里,活生生地把一手好牌打得稀烂。如今走到“卖身”这一步,既是无奈,也是必然。 简单回顾一下背景: 2012年,喜马拉雅成立,一…...
简单理解https与http
都是超文本传输协议,一个安全一个不安全,名字长的安全,名字短的不安全。 安全与不安全是居于什么分别的? 通过加密 http无加密。 httpshttp SSL/TSL(加密)来保障数据安全。加密传输 身份验证 SSL/TLS…...
打造即插即用的企业级云原生平台——KubeSphere 4.1 扩展组件在生产环境的价值全解
目录 打造即插即用的企业级云原生平台——KubeSphere 4.1 扩展组件在生产环境的价值全解 1. 可观测体系:WhizardTelemetry 全家桶 2. 平台与多集群治理 3. CI/CD 与交付效率 4. 网络与流量入口 5. 安全与合规 6. 存储与数据保护 7. 平台集成优势 结语 打造…...
配置扩展ACL
1.扩展ACL简介: 扩展ACL可以更精确地控制基于源IP地址、目标IP地址、协议类型和端口号的流量。 2.配置背景: 为了实现公司内部只能使用FTP服务器传输文件并关闭其他所有服务和端口的需求,可以通过配置访问控制列表(ACL…...