JUC并发编程
进程:系统中正在运行的一个应用程序,程序一旦运行就是进程,是资源分配的最小单元。
线程:系统分配处理器时间资源的基本单元,进程之内独立执行的一个单元执行流,是程序执行的最小单位。
Lock
需要手动上锁和释放锁,synchronized是自动的,Lock操作不当就会出现死锁的问题。
import java.util.concurrent.locks.ReentrantLock;// 创建资源类,定义属性和操作方法
class LTicket {private int number = 30;// 创建可重入锁private final ReentrantLock lock = new ReentrantLock();public void sale(){// 上锁lock.lock();// 判断是否有票可卖try {if (number>0) {System.out.println(Thread.currentThread().getName()+": 卖出"+number--+"剩余"+number+"张票");}} finally {// 解锁,如果线程出现了以上就不能释放锁,其他的线程就无法正常执行了lock.unlock();}}
}
public class LSaleTicket {// 创建多个线程,调用资源类的操作方法// 创建三个线程public static void main(String[] args) {LTicket ticket = new LTicket();new Thread(() -> {for (int i=0;i<40;i++){ticket.sale();}},"A").start();new Thread(() -> {for (int i=0;i<40;i++){ticket.sale();}},"B").start();new Thread(() -> {for (int i=0;i<40;i++){ticket.sale();}},"C").start();}
}
-
Lock是一个接口,而synchronized是Java的关键字,synchronized是内置的语言实现
-
sync在发生异常时会自动释放线程占有的锁,不会导致死锁现象发生,而Lock在发生异常时如果没有主动通过unLock()释放锁,则很可能造成死锁现象,使用Lock时需要再finally中释放锁
-
Lock可以让等待锁的线程响应中断,而synchronized不行,使用synchronized等待的线程会一直等待下去
-
通过Lock可以知道是否成功获取锁,而synchronized无法办到
-
Lock可以提高多个线程进行读操作的效率
多线程编程步骤
-
创建资源类,在资源类创建属性和操作方法
-
在资源类操作方法
-
判断
-
执行
-
通知
-
-
创建多个线程,调用资源类的操作方法
-
判断需要加入到while循环中
线程间的通信
// 线程间的通信 notify()
class Share {private int number = 0;// 一个线程+1,另一个线程-1,保持为0public synchronized void incr() throws InterruptedException {// 判断
// if (number!=0){
// this.wait();// 在哪里睡就会在哪里唤醒,不会重新执行操作
// }// 如果有更多的线程,就需要把wait()放在while循环中while (number!=0){this.wait();}number++;// 通知System.out.println(Thread.currentThread().getName()+"::"+number);this.notifyAll();// 唤醒其他所有等待过程中的线程,表示操作完成了}public synchronized void decr() throws InterruptedException {
// if (number==0){
// this.wait();
// }while (number==0){this.wait();}number--;System.out.println(Thread.currentThread().getName()+"::"+number);this.notifyAll();}
}
public class ThreadDemo1 {public static void main(String[] args) {Share s = new Share();new Thread(()->{for (int i=1;i<=10;i++){try {s.incr();} catch (InterruptedException e) {e.printStackTrace();}}},"AA").start();new Thread(() -> {for (int i=1;i<=10;i++){try {s.decr();} catch (InterruptedException e) {e.printStackTrace();}}},"BB").start();new Thread(()->{for (int i=1;i<=10;i++){try {s.incr();} catch (InterruptedException e) {e.printStackTrace();}}},"CC").start();new Thread(() -> {for (int i=1;i<=10;i++){try {s.decr();} catch (InterruptedException e) {e.printStackTrace();}}},"DD").start();}
}
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;class LShare{private int number = 0;// 创建LOCK对象,可重入锁private Lock lock = new ReentrantLock();// 这个是做什么的????private Condition condition = lock.newCondition();public void incr() throws InterruptedException {lock.lock();try {while (number!=0){condition.await();//等待}number++;System.out.println(Thread.currentThread().getName()+"::"+number);condition.signalAll();}finally {lock.unlock();}}public void decr() throws InterruptedException {lock.lock();try {while (number==0){condition.await();}number--;System.out.println(Thread.currentThread().getName()+"::"+number);condition.signalAll();}finally {lock.unlock();}}}
public class LThreadDemo {public static void main(String[] args) {LShare share = new LShare();new Thread(()->{for (int i=0;i<10;i++){try {share.incr();} catch (InterruptedException e) {e.printStackTrace();}}},"AA").start();new Thread(()->{for (int i=0;i<10;i++){try {share.decr();} catch (InterruptedException e) {e.printStackTrace();}}},"BB").start();new Thread(()->{for (int i=0;i<10;i++){try {share.incr();} catch (InterruptedException e) {e.printStackTrace();}}},"CC").start();new Thread(()->{for (int i=0;i<10;i++){try {share.decr();} catch (InterruptedException e) {e.printStackTrace();}}},"DD").start();}
}
线程间的定制化通信
指定线程操作的顺序。
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;// 创建资源类
class ShareResource {// 定义标志位private int flag = 1;// 创建LOCK锁private Lock lock = new ReentrantLock();private Condition c1 = lock.newCondition();private Condition c2 = lock.newCondition();private Condition c3 = lock.newCondition();// 打印5次,参数第几轮public void print5(int loop) throws InterruptedException {lock.lock();try {// 判断while (flag!=1){c1.await();}// 操作for (int i=0;i<5;i++){System.out.println(Thread.currentThread().getName()+"::"+i+", 轮数:"+loop);}// 通知flag=2;// 修改标志位c2.signal();// 通知BB的线程}finally {lock.unlock();}}public void print10(int loop) throws InterruptedException {lock.lock();try{while (flag!=2){c2.await();}for (int i=0;i<10;i++){System.out.println(Thread.currentThread().getName()+"::"+i+", 轮数:"+loop);}flag=3;c3.signal();}finally {lock.unlock();}}public void print15(int loop) throws InterruptedException {lock.lock();try{while (flag!=3){c3.await();}for (int i=0;i<15;i++){System.out.println(Thread.currentThread().getName()+"::"+i+", 轮数:"+loop);}flag=1;c1.signal();}finally {lock.unlock();}}
}
public class ThreadDemo2 {public static void main(String[] args) {ShareResource shareResource = new ShareResource();new Thread(()->{for (int i=0;i<10;i++){try {shareResource.print5(i);} catch (InterruptedException e) {e.printStackTrace();}}},"AA").start();new Thread(()->{for (int i=0;i<10;i++){try {shareResource.print10(i);} catch (InterruptedException e) {e.printStackTrace();}}},"BB").start();new Thread(()->{for (int i=0;i<10;i++){try {shareResource.print15(i);} catch (InterruptedException e) {e.printStackTrace();}}},"CC").start();}
}
集合的线程安全
List
接口的大多数实现,如 ArrayList
、LinkedList
等,并不是线程安全的。这意味着多个线程同时访问和修改同一个 List
实例时,可能会导致不可预知的行为或数据不一致。
/*** List集合线程不安全*/
public class LThreadDemo2 {public static void main(String[] args) {
// List<String> list = new ArrayList<>();
// List<String> list = new Vector<>();// Vector是线程安全的,但是方法比较老
// List<String> list = Collections.synchronizedList(new ArrayList<>());// 通过工具类方法使得线程安全List<String> list = new CopyOnWriteArrayList<>();//写时复制技术for (int i = 0; i < 30; i++) {new Thread(()->{// 向集合中添加内容list.add(UUID.randomUUID().toString().substring(0,5));// 从集合中获取内容System.out.println(list);}, String.valueOf(i)).start();}}
}
HashSet
线程不安全---->CopyOnWriteArraySet
HashSet本质上是HashMap的键,不能重复且顺序随机
HashMap
---->ConcurrentHashMap
多线程锁
synchronized
实现同步的基础:Java中的每一个对象都可以作为锁。
-
普通同步方法,锁就是当前实例对象
-
静态同步方法,锁就是当前类的Class对象
-
同步方法块,锁是
Synchronized
括号里配置的对象
公平锁和非公平锁
-
非公平锁:
private Lock lock = new ReentrantLock(false)
-
一个线程把所有操作都执行完了,线程饿死
-
优:执行效率高
-
-
公平锁:
new ReentrantLock(true)
-
雨露均沾
-
缺:效率相对低
-
可重入锁
synchronized
(隐式)和Lock
(显示)都是可重入锁。通过同一把锁可以进入代码中的各个区域。(递归锁)
// 可重入锁
public class SyncLockDemo {// 递归调用,死循环,可重入锁也是一种递归锁public synchronized void add() {add();}public static void main(String[] args) {
// synchronized
// Object o = new Object();
// new Thread(()->{
// synchronized (o) {
// System.out.println(Thread.currentThread().getName() + " 外层");
// synchronized (o) {
// System.out.println(Thread.currentThread().getName() + " 中层");
// synchronized (o) {
// System.out.println(Thread.currentThread().getName() + " 内层");
// }
// }
// }
// },"t1").start();// LockLock lock = new ReentrantLock(true);new Thread(()->{try{lock.lock();System.out.println(Thread.currentThread().getName()+" 外层");try{lock.lock();System.out.println(Thread.currentThread().getName()+" 内层");}finally {lock.unlock();}}finally {lock.unlock();}},"t2").start();}
}
死锁
两个以及以上的进程在执行过程中,因为争夺资源而造成一种互相等待的现象,如果没有外力干涉,它们无法再执行下去。
产生死锁原因:
-
系统资源不足
-
进程运行推进顺序不合适
-
资源分配不当
public class DeadLock {static Object a = new Object();static Object b = new Object();public static void main(String[] args) {new Thread(() -> {synchronized (a) {System.out.println(Thread.currentThread().getName()+" 持有锁A试图获取锁B");synchronized (b) {System.out.println(Thread.currentThread().getName()+"获取锁B");}}},"A").start();new Thread(() -> {synchronized (b) {System.out.println(Thread.currentThread().getName()+" 持有锁B试图获取锁A");synchronized (a) {System.out.println(Thread.currentThread().getName()+"获取锁A");}}},"B").start();}
}
验证是否死锁:
-
JPS
,类似Linux中ps -ef
-
jstack
JVM自带的堆栈跟踪工具
Callable接口
Runnable创建线程时,当线程终止,无法返回线程结果,而Callable就支持此功能
// 比较Runnable和Callable两个接口的不同之处
class MyThread1 implements Runnable {@Override// 无返回值public void run() {}
}class MyThread2 implements Callable {@Override// 有返回值public Integer call() throws Exception {return 20;}
}
public class CallableDemo1 {public static void main(String[] args) throws ExecutionException, InterruptedException {// Runnable接口创建线程new Thread(new MyThread1(),"AA").start();// Callable接口创建线程FutureTask<Integer> task = new FutureTask<>(new MyThread2());// 使用lam表达式简化FutureTask<Integer> task2 = new FutureTask<>(()-> {System.out.println(Thread.currentThread().getName()+" come in callable");return 1024;});new Thread(task2,"Winnie").start();// 只要get有返回值了,子线程就算是结束了
// System.out.println(task2.get()+" before while");while (!task2.isDone()){System.out.println("wait....");}System.out.println(task2.get());System.out.println(Thread.currentThread().getName()+" come over");// Future 原理 未来任务// 主线程不影响,单开一个线程执行某个任务,主线程也能使用子线程的资源// 主线程不受影响,开启子线程做其他的任务// 汇总一次}
}
好像写的太长了,后面的东西再新开一篇文章吧。。。
相关文章:
JUC并发编程
进程:系统中正在运行的一个应用程序,程序一旦运行就是进程,是资源分配的最小单元。 线程:系统分配处理器时间资源的基本单元,进程之内独立执行的一个单元执行流,是程序执行的最小单位。 Lock 需要手动上…...
贪心算法解题方法介绍+实操案例——会场安排与月饼售卖问题解析
从贪心算法到实操案例——会场安排与月饼售卖问题解析 前言 贪心算法是一种通过选择局部最优解来尝试构建全局最优解的算法。它简单高效,适用于许多优化问题。本文将详细介绍贪心算法的一般解题步骤,并通过两个实例——月饼售卖问题和会场安排问题——…...
ASP.NET Core API 前后端分离跨域
环境准备 数据库: sqlserver 2022 后端: vs2022 ASP.NET Core API .net 8 前端: Hbuilderx bootstrap 5.3.0 jquery v3.7.1 bootstrap-table 1.23.5 完整项目代码下载地址 功能 实现 单张表 的 增 删 改 查 创建数据库和表 create data…...
用Python绘制医学热图
在医学研究和临床实践中,数据的可视化是不可或缺的一部分。通过直观的数据展示,医学专业人员可以更好地理解各种疾病的治愈率、治疗效果以及医院之间的差异。今天,我们将介绍一种强大的数据可视化工具——热图(Heatmap)…...
使用 Spring Boot 和 GraalVM 的原生镜像
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:历代文学,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计…...
Flutter解压文件并解析数据
Flutter解压文件并解析数据 前言 在 Flutter 开发中,我们经常需要处理文件的读取和解压。 这在处理应用数据更新、安装包、存档文件等场景中尤为常见。 本文将介绍如何在Flutter中使用archive插件来解压文件并解析数据。 准备 在开始之前,我们需要…...
深入理解 JavaScript 引擎与消息队列的底层原理
深入理解 JavaScript 引擎与消息队列的底层原理 JavaScript 是现代 Web 开发中最为重要的编程语言之一,它的运行和执行方式常常是开发者关注的重点。为了更好地理解 JavaScript 的执行过程,我们需要深入探索 JavaScript 引擎的工作原理,尤其…...
使用 ANSYS Forming 和 LS-DYNA 进行金属成形仿真简介
了解金属成型 金属成型是制造业中的关键过程,其中原材料通过变形转化为所需的形状。这可能包括冲压、弯曲和深拉等操作。这些工艺的质量和效率在很大程度上取决于对各种参数的精确控制,例如材料特性、工具几何形状和加工条件。为了优化这些参数并确保成功…...
001-mysql安装
[rootcentos701 ~]# hostname -I 10.0.0.200 172.17.0.1 [rootcentos701 ~]# hostname centos701 [rootcentos701 ~]# rpm -qa | grep mariadb [rootcentos701 ~]# rpm -e --nodeps mariadb-libs-5.5.65-1.el7.x86_64 [rootcentos701 ~]# useradd mysql -s /sbin/nologin #创建…...
以攻击者的视角进行软件安全防护
1. 前言 孙子曰:知彼知己者,百战不殆;不知彼而知己,一胜一负,不知彼,不知己,每战必殆。 摘自《 孙子兵法谋攻篇 》在2500 年前的那个波澜壮阔的春秋战国时代,孙子兵法的这段话&…...
Go 语言性能优化全解析
在当今的软件开发环境中,Go 语言(Golang)因其简洁的语法、高效的并发模型和快速的编译速度而备受青睐。然而,随着应用程序复杂性的增加,即使是在 Go 中也可能会遇到性能瓶颈。为了帮助开发者构建高性能的应用程序&…...
《智能体雏形开发(高阶实操)》二、智能体雏形开发
基于阿里云百炼平台开发智能体应用:生成日报与周报 在智能体开发中,生成结构化的日报与周报是一个典型的任务。本篇文章将基于阿里云百炼平台,结合 Python 开发环境,介绍如何开发一个从日志文件提取信息并生成摘要的智能体。我们将从需求分析、任务设计到核心功能实现逐步…...
【k8s】kubelet 和 API Server的关系
文章目录 概述1. # kubelet 和 API Server 之间的关系**1. 角色和功能****1.1 kubelet****1.2 API Server** **2. 交互关系****2.1 kubelet 从 API Server 获取指令****2.2 kubelet 向 API Server 上报状态****2.3 kubelet 与 API Server 的认证和授权** **3. 典型交互场景****…...
POSTGRESQL跟ORACLE语法区别和相同之处
跟ORACLE语法区别之处 1. Update和delete语法区别 Pg 和MySQL Update和delete的时候表名不能加别名 2. 插入数字类型不一样 ORACLE 对number类型的数据可以用’’ 字符串标记插入,但是PG不行,必须要进行正确的数据类型 3. SEQ使用不同 ORACEL的SEQ…...
Distance in Tree 树形dp练习(树中两点距离为k的数量板子)
Distance in Tree 题面翻译 题目大意 输入点数为 N N N一棵树 求树上长度恰好为 K K K的路径个数 输入格式 第一行两个数字 N , K N,K N,K,如题意 接下来的 N − 1 N-1 N−1行中,每行两个整数 u , v u,v u,v表示一条树边 ( u , v ) (u,v) (u,v) 输出格式 一个整数 a n…...
【MySQL】库的操作+表的操作
库的操作表的操作 1.库的操作 1.1创建数据库1.2删除数据库1.3查找数据库1.4修改数据库1.5数据库备份和恢复1.6查看连接情况 2.库的操作 2.1创建表2.2查看表结构2.3修改表2.4删除表 点赞???收藏???关注??? 你的支持是对我最大的鼓励,我们一起努力吧???…...
vue异步更新,$nextTick
如果将isShowEdit改为true,就会显示输入框和确认按钮、 如果isShowEdit为false的话就显示“大标题”和编辑 想要获取元素焦点,但是vue是异步更新,会出错显示this.$refs.inp是undefined,是因为input元素并没有更新完成,所以需要使用…...
【3D AIGC】Img-to-3D、Text-to-3D、稀疏重建(2024年文章汇总)
文章目录 1. Wonderworld:拓展图片边界,生成3D场景2. 3DTopia-XL:扩散模型辅助生成3. 3DGS-Enhancer: 通过视图一致2D Diffusion,提升无界3D Gaussian Splatting (NlPs2024 Spotlight)4. L3DG:Latent 3D Gaussian Diff…...
简单的springboot使用sse功能
什么是sse? 1、SSE 是Server-Sent Events(服务器发送事件) 2、SSE是一种允许服务器主动向客户端推送实时更新的技术。 3、它基于HTTP协议,并使用了其长连接特性,在客户端与服务器之间建立一条持久化的连接。 通过这条连接&am…...
Nginx 防止IP伪造,绕过IP限制
背景介绍 在使用Nginx时,需要将IP地址转发到后置应用中,往往需要增加配置 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 在后端程序通过读取请求头里的X-Forwarded-For来获取用户客户端IP。 public String getRemortIP(HttpServle…...
原生js仿el-table动态表头
解决动态表头数据量过大导致页面卡顿的问题解决固定前几列导致表头设置宽度失效或者错位的问题功能: 固定前几列合并指定单元格 <div class"tableJoint2"><div><table id"tableData"></table></div><div>…...
【opencv入门教程】9.视频加载
文章选自: 一、VideoCapture类 用于从视频文件、图像序列或摄像头捕获视频的类。函数:CV_WRAP VideoCapture();brief 默认构造函数CV_WRAP explicit VideoCapture(const String& filename, int apiPreference CAP_ANY);brief 使用 API 首选项打开…...
数据结构 ——无头单链表
数据结构 ——无头单链表 一、无头单链表的定义与特性 1、单链表简介 单链表是一种常见的基础数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。无头单链表是单链表的一种变体,其特点是没有明确的头节点࿰…...
【UE5】制作插件 并调试【vs2022】
视频教程:好看视频-轻松有收获 https://www.youtube.com/watch?vIjpa9mI2b5I 原文:【UE】制作插件_ue插件-CSDN博客 C制作插件 1. 我们可以在C工程中创建更多类型的插件,这里我们选择“空白”作为模板来创建插件 点击“创建插件”按钮后…...
Prometheus 采集postgresql监控数据
postgres_exporter 前言 postgres_exporter 是一个用于监控 PostgreSQL 数据库的 Prometheus 导出器。它允许你收集有关 PostgreSQL 数据库性能和状态的指标,并将这些指标暴露给 Prometheus,从而可以在 Grafana 等可视化工具中进行展示和告警。 postgres_exporter download…...
网络分层模型( OSI、TCP/IP、五层协议)
1、网络分层模型 计算机网络是一个极其复杂的系统。想象一下最简单的情况:两台连接在网络上的计算机需要相互传输文件。不仅需要确保存在一条传输数据的通路,还需要完成以下几项工作: 发起通信的计算机必须激活数据通路,这包括发…...
POI遍历行所有单元格的两种方式,getPhysicalNumberOfCells方式有问题,勿用
今天看POI源码的时候,发现HSSFWorkbook类型的工作簿,行数据是用TreeMap<Integer, HSSFRow>存储的,列数据是用HSSFCell[]数组来存的;XSSFWorkbook类型的工作簿,行数据是用SortedMap<Integer, XSSFRow>存储的…...
Latex转word(docx)或者说PDF转word 一个相对靠谱的方式
0. 前言 投文章过程中总会有各种各样的要求,其中提供word格式的手稿往往是令我头疼的一件事。尤其在多公式的文章中,其中公式转换是一个头疼的地方,还有很多图表,格式等等,想想就让人头疼欲裂。实践中摸索出一条相对靠…...
敖汉宝塔油页岩露天矿山安全自动化监测
1. 项目简介 本次项目位于内蒙古自治区赤峰市敖汉旗宝国吐乡大青山村,地理位置好。主营许可经营项目:无一般经营项目:页岩油生产;页岩油、润滑油、建筑材料(不含油漆)销售等单位规模1-20人,单位…...
Android笔记【14】结合LaunchedEffect实现计时器功能。
一、问题 cy老师第五次作业 结合LaunchedEffect实现计时器功能。要求:动态计时,每秒修改时间,计时的时间格式为“00:00:00”(小时:分钟:秒)提交源代码的文本和运行截图…...
三维重建(单目、双目、多目、点云、SFM、SLAM)
1 相机几何与标定1.1 相机模型中的坐标系1.2 四种坐标系之间的转换1.3 相机内参1.4 相机标定 2 传统三维重建2.1 RGBD三维重建2.1.1 KinectFusion2.1.2 BundleFusion 2.1 MVS三维重建2.2.1 COLMAP2.2.2 OpenMVS 3 点云三维重建3.1 3D点云任务3.2 点云数据3.3 特征提取3.3.1 Poi…...
软体机器人动态手内笔旋转研究
人工智能咨询培训老师叶梓 转载标明出处 软体机器人因其在安全互动方面的优势而备受关注,但在高速动态任务中却面临挑战。最近,卡内基梅隆大学机器人研究所的研究团队提出了一种名为SWIFT的系统,旨在通过学习和试错来实现软体机器人手的动态…...
福昕PDF低代码平台
福昕PDF低代码平台简介 福昕PDF 低代码平台是一款创新的工具,旨在简化PDF处理和管理的流程。通过这个平台,用户可以通过简单的拖拽界面上的按钮,轻松完成对Cloud API的调用工作流,而无需编写复杂的代码。这使得即使没有编程经验的…...
【笔记】Linux中使用到的一些操作
1、查找指定文件并执行删除 find . -name "checkpoint_*_*.pth" -type f -exec rm -f {} \; 2、查看每个文件夹占用空间 du -h --max-depth1 3、移动文件 mv valid.zip ./xg mv 文件 目标位置 4、删除文件夹 rmdir folder rm -r folder # 递归删除文件夹下所有内容…...
深入浅出:PHP中的表单处理全解析
引言 在Web开发的世界里,表单是用户与服务器之间交互的重要桥梁。它们允许用户提交信息,并通过后端语言(如PHP)进行处理。本文将带你深入了解PHP中的表单处理,从基础的创建和提交到高级的安全措施和实用技巧ÿ…...
智已汽车x-signature 登录算法 签到
智已汽车x-signature 登录算法 签到 python代码成品...
一、测试工具LoadRunner Professional脚本编写-录制前设置
设置基于URL的脚本 原因:基于HTML的脚本会导致login接口不能正确录制 设置UTF-8 原因:不勾选此项会导致脚本中文变为乱码...
LSTM+改进的itransformer时间序列预测模型代码
代码在最后 本次设计了一个LSTM基于差分多头注意力机制的改进的iTransformer时间序列预测模型结合了LSTM(长短期记忆网络)和改进版的iTransformer(差分多头注意力机制),具备以下优势: 时序特征建模能力&am…...
linux中 Systemd 和 cgroups 的关系详解
systemd 是 Linux 的一个初始化系统和服务管理器,它依赖于 Linux 内核的 cgroups(Control Groups)功能来实现对系统资源的高效管理。以下是对两者关系的详细解读: 1. 什么是 cgroups? cgroups 是 Linux 内核提供的一种…...
发布Apache2.4** 局域网无法访问
1。 防火墙关闭 或者 设置入站规则 2,查看httpd.conf 文件 设置配置 原 Listen 80 修改成 Listen 192.168.31.127:90 3.确保 本地IP 是否正确...
【JAVA】Java高级:多数据源管理与Sharding:在Spring Boot应用中实现多数据源的管理
一个电商平台可能需要一个数据库来存储用户信息,另一个数据库来存储订单信息,甚至可能还有一个数据库用于数据分析。这种情况下,如何在Spring Boot应用中实现多数据源的管理就显得尤为重要。 1. 多数据源管理的重要性 在实际应用中…...
Android 分词的两种方式
前言: 本文分别介绍了原生和三方(Jieba)两种分词方式的使用和注意事项 1、安卓原生BreakIterator分词 比较简单,但是效果不太行 /*** 功能:原生分词* 参数:text:需要分词的语句* 返回值:return…...
【开源免费】基于SpringBoot+Vue.JS中小型医院网站(JAVA毕业设计)
博主说明:本文项目编号 T 078 ,文末自助获取源码 \color{red}{T078,文末自助获取源码} T078,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...
数据结构代码归纳
1.线性表 线性表的顺序表示 定义与初始化 typedef struct SqList{ElemType data[MaxSize];//ElemType *data 开动态数组 int length; }Sqlist; void InitList(SqList &L){L.length0;//若静态数组//若动态数组 //L.data(ElemType*)malloc(sizeof(ElemType)*MaxSize); }…...
2024-金盾信安杯线上赛 WP
Misc 大赛宗旨 记事本打开,一眼零宽隐写 B 神工具一把梭,得到一串 base 编码 base64 解码得到 flag flag 值:flag{5d5555fa-1303-4b43-8eef-d6ea7c64c361} esab 根据题目 esab 可以发现这正是 base 的逆向,所以可以先逆向一下…...
iOS如何自定义一个类似UITextView的本文编辑View
对于IOS涉及文本输入常用的两个View是UITextView和UITextField,一个用于复杂文本输入,一个用于简单文本输入,在大多数开发中涉及文本输入的场景使用这两个View能够满足需求。但是对于富文本编辑相关的开发,这两个View就无法满足自…...
JavaWeb文件上传
文件上传总览 文件上传主要是指将本地文件(包括但不限于图片、视频、音频等)上传到服务器,提供其他用户浏览或下载的过程。在日常生活中,我们在很多情况下都需要使用文件上传功能,比如:发微博、发朋友圈等…...
C#实现1ms定时器不精准?如何实现一个高性能高精度的1ms定时器?(附完整示例Demo)
在C#日常开发中,我们经常需要使用定时器(Timer)进行周期性任务的执行。 例如,每隔1秒打印一条日志,或每隔100毫秒执行某个数据刷新逻辑。 但是,当我们尝试在C#中实现一个1毫秒(1ms)…...
LeetCode 3. 无重复字符的最长子串
题目链接:3. 无重复字符的最长子串 首先想到的就是暴力破解,直接两层循环遍历,因为它说求无重复,那就可以用 set 来存储遍历到的字符,如果遍历到了同样的字符(在 set 中存在),就直接跳出第二层循环&#x…...
深度解析 Ansible:核心组件、配置、Playbook 全流程与 YAML 奥秘(上)
文章目录 一、ansible的主要组成部分二、安装三、相关文件四、ansible配置文件五、ansible 系列 一、ansible的主要组成部分 ansible playbook:任务剧本(任务集),编排定义ansible任务集的配置文件,由ansible顺序依次执…...