Java 并发舞台:多线程小精灵的奇幻冒险之旅
1.线程池的拒绝策略有哪些?
Java中的线程池提供了几种不同的拒绝策略,当线程池无法处理新的任务时(比如因为线程池已满并且工作队列也满了),这些策略会决定如何处理新提交的任务。ThreadPoolExecutor类中定义了以下四种内置的拒绝策略:
- AbortPolicy:这是默认的拒绝策略。当有新任务提交且线程池无法处理时,它会抛出一个RejectedExecutionException异常。
- CallerRunsPolicy:如果任务被拒绝,则该策略会在调用线程(即提交任务的线程)中执行被拒绝的任务。这将降低新任务的提交速度,并减轻系统过载的压力。注意,如果调用线程是池中的一个工作线程,那么这个策略可能会导致额外的任务执行,从而可能进一步延迟其他任务的执行。
- DiscardPolicy:此策略会悄悄地丢弃被拒绝的任务,不会给调用者任何通知。因此,使用此策略时应特别小心,因为它可能导致任务丢失而没有警告。
- DiscardOldestPolicy:此策略会抛弃工作队列中最老的任务(即在队列中等待最久的任务),然后尝试重新提交当前被拒绝的任务。请注意,这个操作可能会重复进行,直到有空间可以接受新任务或者任务再次被拒绝并触发其他的拒绝策略。
2.说说你对JMM内存模型的理解?为什么需要JMM?
Java内存模型(Java Memory Model, JMM)是Java编程语言中定义的一组规则或规范,这些规则决定了线程之间的交互行为以及如何和共享变量进行交互。JMM主要关注于程序中的读、写操作与内存之间发生的可见性、原子性和有序性问题。理解JMM对于编写正确的并发程序非常重要。
为什么需要JMM?
-
硬件架构的复杂性:现代计算机系统通常包含多个处理器核心,每个核心都有自己的高速缓存。当多线程程序运行时,不同的线程可能在不同的核心上执行,这导致了缓存一致性的问题。即一个线程对共享变量的更新可能不会立即被其他线程看到,因为它们查看的是本地缓存副本。JMM通过定义一套规则来确保不同线程间的数据可见性,即使是在异构硬件平台上。
-
编译器优化:为了提高性能,编译器可能会对代码指令重新排序,只要这种重排序不会改变单线程程序的行为。然而,在多线程环境中,这样的优化可能会导致难以预测的行为。JMM规定了哪些编译器优化是可以接受的,并且确保程序员能够预期到多线程程序的行为。
-
提供同步机制:JMM为Java提供了同步机制的基础,比如volatile关键字、synchronized块/方法等,这些都依赖于内存模型来保证跨线程的数据一致性和正确性。
JMM的关键概念
- 原子性:指一个或多个操作作为一个不可分割的整体执行,要么全部执行,要么都不执行。例如,long和double类型的非原子性协定赋值就是一个例子,因为它们的操作可能跨越64位边界并因此不是原子性的。
- 可见性:当一个线程修改了一个共享变量的值,这个新值应该对其他线程是可见的。volatile变量可以保证这一点,同时synchronized和锁机制也能保证可见性。
- 有序性:程序代码的执行顺序并不总是按照源代码中的顺序执行,编译器、处理器和运行时环境都可以对指令进行重排序以优化性能。happens-before关系是JMM用来保证某些操作必须看起来是按特定顺序发生的一种手段,它确保了某些操作的执行结果对于所有线程都是可见的。
总之,JMM是一个抽象的概念框架,用于帮助开发者理解和预测多线程程序的行为,尤其是在涉及到内存访问的时候。它使得开发者能够在不知道底层硬件细节的情况下,编写出正确且高效的并发程序。
3.多线程有什么用?
多线程编程在现代软件开发中扮演着重要角色,它为应用程序带来了诸多好处,特别是在提升性能和响应性方面。以下是多线程的主要用途和优势:
- 提高CPU利用率:在多核处理器环境中,多线程可以充分利用每个核心的能力,使得程序能够并行执行多个任务,从而显著提高处理速度和效率。
- 改善用户体验:通过将耗时操作(如文件读写、网络请求等)放到后台线程中执行,可以让用户界面保持流畅,不会因为等待这些操作完成而卡顿或无响应。这对于图形用户界面(GUI)应用尤为重要。
- 实现并发性:多线程允许一个程序同时进行多项活动。例如,在服务器端应用中,一个线程可以监听新的客户端连接,而其他线程则负责处理已建立的连接上的请求。
- 简化复杂问题的解决:对于一些逻辑上天然适合并行处理的问题,比如图像处理、科学计算、大规模数据分析等,使用多线程可以更直观地建模解决方案,并且更容易管理和维护代码。
- 资源复用:线程共享进程的资源(如内存地址空间),这减少了创建新进程的开销。相比于启动一个新的进程,创建一个新线程通常更快,消耗的系统资源也更少。
- 增强应用程序的灵活性和可扩展性:利用线程池等高级特性,可以根据需要动态调整正在运行的任务数量,以适应不同的负载情况,进而优化整体性能。
- 分布式系统的构建基础:在分布式计算框架中,多线程常用于管理与远程节点之间的通信,以及协调本地和远程任务的执行。
然而,需要注意的是,虽然多线程提供了很多优势,但它也引入了诸如死锁、竞态条件等问题,这些问题需要开发者仔细设计和调试来避免。此外,不当的多线程使用可能会导致性能下降而不是提升。因此,正确理解和合理运用多线程技术是非常重要的。
4.说说CyclicBarrier和CountDownLatch的区别?
CyclicBarrier 和 CountDownLatch 都是 Java 并发包(java.util.concurrent)中提供的同步辅助类,用于协调多个线程之间的操作。然而,它们在使用场景和行为上有显著的区别。
CountDownLatch
- 初始化时设定计数:CountDownLatch 在创建时需要指定一个计数值(count),这个值代表了需要等待的操作数量。
- 一次性使用:一旦计数器减至零,它就不能再被重置,也就是说,CountDownLatch 是不可循环使用的。所有等待该锁存器的线程将会被释放,并且后续对 await() 方法的调用将立即返回。
- 典型应用场景:常用于一个或多个线程等待其他一组线程完成某些操作后再继续执行的情况。例如,主线程等待所有工作线程完成任务后才继续。
CountDownLatch latch = new CountDownLatch(3); // 创建一个计数为3的锁存器
// 其他线程完成任务后调用 latch.countDown();
latch.await(); // 主线程等待直到计数归零
CyclicBarrier
- 可重复使用:与 CountDownLatch 不同的是,CyclicBarrier 可以在达到屏障点后被重置并再次使用。这意味着它可以用来管理一系列需要反复执行的任务。
- 屏障动作:可以在创建 CyclicBarrier 时提供一个 Runnable 对象作为参数,当所有参与的线程都到达屏障点时,会先执行这个动作。
- 典型应用场景:适用于多个线程需要相互等待到达某个状态点才能继续执行的情况,比如迭代式的计算过程,或者多线程之间进行数据交换等场景。
CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {public void run() {// 当所有线程都到达屏障点时执行的动作}
});
// 线程在执行完各自的任务后调用 barrier.await();
总结
- 如果你需要一次性的等待机制,那么 CountDownLatch 是合适的选择;而如果你的需求涉及到多次重复的等待/通知模式,则应该考虑使用 CyclicBarrier。
- CyclicBarrier 提供了更灵活的行为,包括可以定义屏障到达时执行的动作,并且能够重置以供下一轮使用。
- 选择哪种工具取决于具体的应用场景和需求。
5.什么是AQS?
AQS,全称 AbstractQueuedSynchronizer(抽象队列同步器),是 Java 并发包 (java.util.concurrent) 中的一个核心组件。它提供了一种机制来实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关的同步器(如信号量、事件等)。AQS 是许多同步工具类(如 ReentrantLock、Semaphore、CountDownLatch 和 CyclicBarrier)的基础构建块。
AQS 的核心概念
- 状态(State):AQS 使用一个 volatile int 类型的状态变量来表示同步状态。这个状态可以被原子性地更新,用于表示资源是否可用或被占用的程度。例如,在 ReentrantLock 中,这个状态代表了锁的持有次数;在 Semaphore 中,它则表示剩余许可的数量。
- 等待队列:AQS 维护了一个 CLH(Craig, Landin, and Hagersten locks)类型的 FIFO 队列,用于管理那些试图获取同步状态但未能成功的线程。每个节点(Node)代表一个等待中的线程,并且这些节点按照加入顺序排列形成链表结构。
- 独占式 vs 共享式:AQS 支持两种模式的同步——独占式(Exclusive)和共享式(Shared)。独占式意味着同一时刻只能有一个线程成功获取到同步状态;而共享式允许多个线程同时获得同步状态,只要它们符合特定条件。
- 模板方法模式:AQS 采用模板方法模式,定义了一些公共的方法供子类使用,但是具体的同步逻辑需要由子类自行实现。比如 tryAcquire(int)、tryRelease(int) 等方法就需要根据具体的需求来定制实现。
AQS 的主要功能
- acquire() 和 release():用于以独占方式尝试获取或释放同步状态。如果无法立即获取,则将当前线程添加到等待队列中并使其进入等待状态。
- acquireShared() 和 releaseShared():用于以共享方式尝试获取或释放同步状态。与独占模式不同的是,这里允许多个线程同时持有同步状态。
- ConditionObject:AQS 还提供了条件队列的支持,通过 ConditionObject 可以实现类似于 Object Monitor 的 wait/notify 功能。
为什么使用 AQS?
AQS 提供了一个高效且灵活的框架来实现复杂的同步控制逻辑,极大地简化了自定义同步器的开发难度。开发者只需要关注如何管理同步状态以及何时允许线程获取同步状态,而不必关心线程调度、等待队列管理等底层细节。这使得我们可以更专注于业务逻辑本身,同时也保证了代码的质量和性能。
总之,AQS 是 Java 并发编程的重要组成部分,为构建高性能、高可靠的并发程序提供了坚实的基础。
相关文章:
Java 并发舞台:多线程小精灵的奇幻冒险之旅
1.线程池的拒绝策略有哪些? Java中的线程池提供了几种不同的拒绝策略,当线程池无法处理新的任务时(比如因为线程池已满并且工作队列也满了),这些策略会决定如何处理新提交的任务。ThreadPoolExecutor类中定义了以下四…...
PostgreSQL 性能优化全方位指南:深度提升数据库效率
PostgreSQL 性能优化全方位指南:深度提升数据库效率 别忘了请点个赞收藏关注支持一下博主喵!!! 在现代互联网应用中,数据库性能优化是系统优化中至关重要的一环,尤其对于数据密集型和高并发的应用而言&am…...
【Go 基础】并发相关
并发相关 CAS CAS算法(Compare And Swap),是原⼦操作的⼀种,,CAS 算法是⼀种有名的⽆锁算法。⽆锁编程,即不使⽤锁的情况下实现多线程之间的变量同步。可⽤于在多线程编程中实现不被打断的数据交换操作,从…...
5G CPE终端功能及性能评测(四)
5G CPE 功能性能评测 本文选取了几款在工业应用领域应用较多的5G CPE,对其功能和性能进行了对比评测。功能方面主要对比了网络接口数量,VPN功能 支持情况。以下测试为空口测试,测试结果受环境影响较大,性能仅供参考。总体看,高通X55芯片下行最优,速率稳定。 功能 对比CPE…...
开源模型应用落地-qwen模型小试-Qwen2.5-7B-Instruct-tool usage入门-集成心知天气(二)
一、前言 Qwen-Agent 是一个利用开源语言模型Qwen的工具使用、规划和记忆功能的框架。其模块化设计允许开发人员创建具有特定功能的定制代理,为各种应用程序提供了坚实的基础。同时,开发者可以利用 Qwen-Agent 的原子组件构建智能代理,以理解和响应用户查询。 本篇将介绍如何…...
JS进阶DAY3|事件(一)事件监听及事件类型
目录 一、事件监听方式(绑定) 1.1 DOM0级事件 1.2 DOM2级事件 1.3 区别 二、事件类型 2.1 鼠标事件 2.2 键盘事件 2.3 焦点事件 2.4 表单事件 2.5 加载和卸载事件 2.6 滚动事件 2.7 触摸事件(在支持触摸的设备上) 一…...
数据结构与算法之美:单链表
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《数据结构与算法之美》、《编程之路》、《题海拾贝》 欢迎点赞,关注! 目录 …...
从ctfwiki开始的pwn之旅 6.ret2reg
原理 Ret2reg,即攻击绕过地址混淆(ASLR),返回到寄存器地址 一般用于开启ASLR的ret2shellcode题型。 出现该漏洞的代码的典型特征是:程序中存在strcpy的字符串拷贝函数。 ret2reg(返回到寄存器地址攻击)是一种利用技…...
GESP202412 7级 T2
闲话 花了一个小时。 主要原因:条初始值硬控我半小时,题目看错硬控我半小时(悲)。 正文 看题目,就是求从哪个点出发所得到的所有单调下降序列的总长度最长(这个描述好奇怪,不过意思是对的)。 题目中说…...
LeetCode---426周赛
题目列表 3370. 仅含置位位的最小整数 3371. 识别数组中的最大异常值 3372. 连接两棵树后最大目标节点数目 I 3373. 连接两棵树后最大目标节点数目 II 一、仅含置位位的最小整数 题目要求我们返回二进制数位全为1,且大于 n 的最小的整数,我们可以直…...
git 拉取代码时报错 gitignore Please move or remove them before you merge.
git 拉取代码时报错, The following untracked working tree files would be overwritten by merge: .gitignore Please move or remove them before you merge. 当你在使用 Git 进行代码拉取(通常是执行 git pull 或 git merge 命令)时遇到这…...
devops-Dockerfile+Jenkinsfile方式部署Java前后端应用
文章目录 概述部署前端Vue应用一、环境准备1、Dockerfile2、.dockerignore3、nginx.conf4、Jenkinsfile 二、Jenkins部署1、新建任务2、流水线3、Build Now 构建 & 访问 Springboot后端应用1. 准备工作2. 创建项目结构3. 编写 Dockerfile后端 Dockerfile (backend/Dockerfi…...
华为云鸿蒙应用入门级开发者认证考试题库(理论题和实验题)
注意:考试链接地址:华为云鸿蒙应用入门级学习认证_华为云鸿蒙应用入门级开发者认证_华为云开发者学堂-华为云 当前认证打折之后是1元,之后原价700元,大家尽快考试!考试题库里面答案不一定全对,但是可以保证…...
Lua元表和元方法的使用
元表是一个普通的 Lua 表,包含一组元方法,这些元方法与 Lua 中的事件相关联。事件发生在 Lua 执行某些操作时,例如加法、字符串连接、比较等。元方法是普通的 Lua 函数,在特定事件发生时被调用。 元表包含了以下元方法࿱…...
自动驾驶算法——卡尔曼滤波器平滑感知车道线参数【C++代码实现】
1.算法原理 在工程实践中,由于感知识别到的车道线偶尔存在较大的跳变,导致后端控制算法计算出的控制角度也存在较大的跳变,所以我们需要对感知输入的车道线系数进行平滑处理。 已知卡尔曼滤波算法主要分为以下几大步骤: 感知将车道线以三次螺旋曲线方程 y = c 0 + c 1 x +…...
浅谈Scala语言
一、Scala语言基础 1.1 语法结构 Scala的语法是一种融合了多种编程范式的设计,它结合了函数式编程和面向对象编程的优点。这种语法结构使得Scala既具有高度的表达能力,又保持了代码的简洁性。例如,Scala支持类型推断,这意味着在…...
可视化建模以及UML期末复习篇----UML图
这是一篇相对较长的文章,如你们所见,比较详细,全长两万字。我不建议你们一次性看完,直接跳目录找你需要的知识点即可。 --------欢迎各位来到我UML国! 一、UML图 总共有如下几种: 用例图(Use Ca…...
音视频入门基础:MPEG2-TS专题(13)——FFmpeg源码中,解析Section Header的实现
一、引言 在《音视频入门基础:MPEG2-TS专题(11)—— TS中的Section》中讲述了Section Header的基本概念,本文讲述FFmpeg源码中是怎样解析Section Header的。 二、parse_section_header函数的定义 FFmpeg源码中通过parse_section…...
SQL UCASE() 函数:转换字符串为大写
SQL UCASE() 函数:转换字符串为大写 概述 在SQL中,UCASE() 函数用于将字符串中的所有字符转换为大写。这是一个非常实用的函数,尤其在处理大量文本数据时,确保数据的一致性和准确性。本文将详细介绍UCASE() 函数的用法、示例以及…...
机器学习周报(12.2-12.8)
文章目录 摘要Abstract Vision Transformer1 原理2 代码 摘要 本周学习了Vision Transformer (ViT) 的基本原理及其实现,并完成了基于PyTorch的模型训练、验证和预测任务。深入理解了ViT如何将图像分割成patch作为输入序列,并结合Transformer Encoder处…...
【机器人】系统辨识之激励轨迹设计(傅里叶级数)
在机器人参数辨识中使用傅里叶级数,主要是为了生成一种激励轨迹,具有良好的数学特性,同时符合物理要求。傅里叶级数的特性使其在机器人动力学辨识的激励轨迹设计中非常常用。 1. 为什么需要激励轨迹? 激励轨迹的作用是通过驱动机…...
JVM八股文精简
目录 简述JVM类加载过程简述JVM中的类加载器简述双亲委派机制双亲委派机制的优点简述JVM内存模型简述程序计数器简述虚拟机栈简述本地方法栈简述JVM中的堆简述方法区简述运行时常量池简述Java创建对象的过程简述JVM给对象分配内存的策略Java对象内存分配是如何保证线程安全的如…...
PyTorch基本使用——张量的索引操作
在操作张量时,经常要去获取某些元素进行处理或者修改操作,在这里需要了解torch中的索引操作。 准备数据: data torch.randint(0,10,[4,5]) print(data--->,data)输出结果: data---> tensor([[3, 9, 4, 0, 5],[7, 5, 9, …...
mysql集群MHA方式部署
1. 基本信息 部署机器角色部署路径192.168.242.71MySQL-Mater MHA-NodeMySQL: /alidata1/mysql-8.0.28192.168.242.72MySQL-Slave MHA-NodeMHA-Node: /alidata1/admin/tools/mha4mysql-node-0.58192.168.242.73MySQL-Slave MHA-Node192.168.242.74MHA-ManagerMHA-Manager: …...
Spring Boot中实现JPA多数据源配置指南
本文还有配套的精品资源,点击获取 简介:本文详细介绍了在Spring Boot项目中配置和使用JPA进行多数据源管理的步骤。从引入依赖开始,到配置数据源、创建DataSource bean、定义实体和Repository,最后到配置事务管理器和使用多数据…...
【计算机网络】实验12:网际控制报文协议ICMP的应用
实验12 网际控制报文协议ICMP的应用 一、实验目的 验证ping命令和tracert命令的工作原理。 二、实验环境 Cisco Packet Tracer模拟器 三、实验过程 1.构建网络拓扑并进行信息标注,将所需要配置的IP地址写在对应的主机或者路由器旁边,如图1所示。 图…...
MVC基础——市场管理系统(二)
文章目录 项目地址三、Produtcts的CRUD3.1 Products列表的展示页面(Read)3.1.1 给Product的Model里添加Category的属性3.1.2 View视图里展示Product List3.2 增加Product数据(Add)3.2.1 创建ViewModel用来组合多个Model3.2.2 在_ViewImposts里引入ViewModels3.2.3 添加Add的…...
使用Redis的Bitmap实现签到功能
1.基础签到实现 1.1代码如下Service Slf4j public class SignInService {Autowiredprivate StringRedisTemplate redisTemplate;private static final String SIGN_KEY_PREFIX "sign:";/*** 用户签到* param userId 用户ID* param date 签到日期*/public boolean s…...
OpenCV 图像基本操作
OpenCV快速通关 第一章:OpenCV 简介与环境搭建 第二章:OpenCV 图像基本操作 OpenCV 图像基本操作 OpenCV快速通关第二章:OpenCV 图像基本操作一、相关结构体与函数介绍(一)cv::Mat 结构体(二)c…...
SpringBoot3+Micormeter监控应用指标
监控内容简介 SpringBoot3项目监控服务 ,可以使用Micormeter度量指标库,帮助我们监控应用程序的度量指标,并将其发送到Prometheus中并用Grafana展示。监控指标有系统负载、内存使用情况、应用程序的响应时间、吞吐量、错误率等。 micromete…...
Leetcode打卡:变为棋盘
执行结果:通过 题目:782 变为棋盘 一个 n x n 的二维网络 board 仅由 0 和 1 组成 。每次移动,你能交换任意两列或是两行的位置。 返回 将这个矩阵变为 “棋盘” 所需的最小移动次数 。如果不存在可行的变换,输出 -1。 “棋盘…...
遣其欲,而心自静 -- 33DAI
显然,死做枚举只能的50分。 错了4次总算对了。 大体思路: 因题目说只有两个因数,那么有两种情况: 1:两个质数相乘,如:3*515 5*745 等(不包括5*525 或5*315 重复计算\ 因为3*5算了…...
物品识别 树莓派 5 YOLO v5 v8 v10 11 计算机视觉
0. 要实现的效果 让树莓派可以识别身边的一些物品,比如电脑,鼠标,键盘,杯子,行李箱,双肩包,床,椅子等 1. 硬件设备 树莓派 5 raspberrypi.com/products/raspberry-pi-5/树莓派官方摄…...
鸿蒙NEXT元服务:静态卡片
【引言】 最近上线的鸿蒙NEXT元服务受到了一些用户的反馈,指出其缺乏一个直观的入口。为了解决这个问题并提供类似传统应用程序的桌面快捷方式体验,决定通过添加静态卡片功能来让用户能够直接从桌面访问元服务。本文将详细介绍如何实现这一功能。 【参考…...
vue3父子组件通信
一般常用有6种方式: 使用 props 传递数据:父组件通过 props 传递数据给子组件,子组件通过 defineProps 获取父组件定义的数据。使用 v-model 语法糖:父组件通过 v-model="abc" 传递数据,并监听子组件的更新事件,子组件:通过 defineEmits 获取父传入的属性的更…...
2024年认证杯SPSSPRO杯数学建模D题(第一阶段)AI绘画带来的挑战解题全过程文档及程序
2024年认证杯SPSSPRO杯数学建模 D题 AI绘画带来的挑战 原题再现: 2023 年开年,ChatGPT 作为一款聊天型AI工具,成为了超越疫情的热门词条;而在AI的另一个分支——绘图领域,一款名为Midjourney(MJÿ…...
虚幻引擎---材质篇
一、基础知识 虚幻引擎中的材质(Materials) 定义了场景中对象的表面属性,包括颜色、金属度、粗糙度、透明度等等;可以在材质编辑器中可视化地创建和编辑材质;虚幻引擎的渲染管线的着色器是用高级着色语言(…...
【Linux基础】yum 与 vim 的操作
目录 Linux 应用商店——yum yum和yum源是什么 关于镜像的简单理解 yum 的基本操作 yum的安装 yum install 命令 yum查看软件包 yum list 命令 yum的卸载 yum remove 命令 关于 rzsz 软件 安装 rzsz 软件: rz 命令 sz 命令 yum 源拓展 Linux 编辑器…...
一句话木马
作用: 一句话木马的作用主要是利用计算机系统或网络协议的安全漏洞,以实现未经授权访问、数据窃取或其他恶意目的。 木马举例: 1.PHP <?php eval($_POST[attack]);?> 解释 • <?php ... ?> 是 PHP 代码的开始和结束标记…...
给建筑物“穿毛衣”:AI绘图新玩法
随着气温的骤降,我们不仅感受到了自然界的寒冷,甚至连城市的建筑物似乎也在寒风中“颤抖”。在这样的背景下,一种新颖的AI绘图玩法——给建筑“穿毛衣”在网络上迅速走红。本文将详细介绍这一创意玩法,并提供手把手的教学指导。 A…...
【Qt】Qt Creator项目文件(.pro 文件)构建指令学习
文章目录 1. DESTDIR作用:实例: 2. INCLUDEPATH作用:实例: 3. LIBS作用:用法:实例: 4. TEMPLATE作用:实例: 5. OTHER_FILES作用:实例:其它说明 6.…...
突破!自然语言强化学习(NLRL):一个可处理语言反馈的强化学习框架
本论文由伦敦大学学院、上海交通大学、布朗大学、布里斯托大学、新加坡国立大学以及萨里大学的研究者合作完成。 冯熙栋是论文第一作者,即将毕业于伦敦大学学院。目前是Google DeepMind的Research Scientist,主要研究方向包括强化学习与生成模型。刘博是…...
core Webapi jwt 认证
core cookie 验证 Web API Jwt 》》》》用户信息 namespace WebAPI001.Coms {public class Account{public string UserName { get; set; }public string UserPassword { get; set; }public string UserRole { get; set; }} }》》》获取jwt类 using Microsoft.AspNetCore.Mvc…...
【Springboot知识】springboot基础-事件
文章目录 简介一、事件类型二、事件处理机制三、自定义事件和监听器四、异步事件处理五、条件事件监听 如何使用1. 自定义事件2. 发布事件3. 监听事件4. 测试事件机制 ApplicationEventPublisher接口使用的设计模式 简介 在Spring Boot中,事件机制是一种基于观察者…...
经典视觉神经网络1 CNN
一、概述 输入的图像都很大,使用全连接网络的话,计算的代价较高,图像也很难保留原本特征。 卷积神经网络(Convolutional Neural Network,CNN)是一种专门用于处理具有网格状结构数据的深度学习模型。主要应用…...
解决跨域问题方案
跨域问题在前后端分离架构下尤为常见,是每个 Web 开发者都会遇到的核心问题。本文将通过原理解析、场景剖析、解决方案详解以及最佳实践等多个维度,帮助开发者全面理解并有效应对跨域问题。 目录 **一、跨域的本质****1. 同源策略****2. 同源策略的限制范…...
【python自动化五】接口自动化基础--requests的使用
python的接口请求可以用requests库,这个介绍就不多说了,网上说得很详细。 接下来直接记录下如何使用(当然也不限于自动化的使用) 1.安装requests requests也需要安装一下 pip install requests2.requests请求 1.常用的请求方法…...
文本三剑客——grep命令
介绍 作用 Linux grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。 常用选项 -i:忽略大小写进行匹配。-v:反向查找,只打印不匹配的行。-n:显示匹配行的行号。-r:递归查找子目录…...
ASP 实例:深入解析与实战应用
ASP 实例:深入解析与实战应用 引言 ASP(Active Server Pages)是一种由微软开发的服务器端脚本环境,用于动态网页设计和开发。它允许开发者创建和运行动态交互性网页,如访问数据库、发送电子邮件等。本文将深入探讨AS…...
文件的操作
什么是文件 如何是数据持久化——保存在硬盘上(文件,数据库)磁盘上的文件是文件在程序设计中,我们一般谈的文件有两种:程序文件、数据文件程序文件,比如源文件(.c文件)读a文件写到b文件里,此时a…...