自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(135)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 SpringSecurity web.ignoring()不起作用分析

虽然在WebSecurity.ignoring().antMatchers()中配置了自己要放行的地址,但是我定义了自定义的过滤器。然而自定义过滤器交给了spring IOC管理,所以你在spring Security的config无论怎么配都会走到自己的过滤器。请注意如若只在自己的过滤器中设置白名单还不行,因为请求还会走SpringSecurity的过滤器链,必须两边都配置。如果只想配置一边,可以在自己过滤器放行请求时,直接给本次请求设置一个默认的认证身份。

2023-07-25 15:47:15 1463

原创 JVM 类加载器

根据官方 API 文档的介绍:类加载器是一个负责加载类的对象。是一个抽象类。给定类的二进制名称,类加载器应尝试定位或生成构成类定义的数据。典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。每个 Java 类都有一个引用指向加载它的。不过,数组类不是通过创建的,而是 JVM 在需要的时候自动创建的,数组类通过方法获取的时候和该数组的元素类型的是一致的。类加载器是一个负责加载类的对象,用于实现类加载过程中的加载这一步。

2023-04-10 12:36:05 1423 1

原创 JVM 类的加载过程

所以,在 JVM 生命周期内,由 jvm 自带的类加载器加载的类是不会被卸载的。但是由我们自定义的类加载器加载的类是可能被卸载的。不过,数组类不是通过 ClassLoader 创建的,而是 JVM 在需要的时候自动创建的,数组类通过。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符 7 类符号引用进行。方法获取 ClassLoader 的时候和该数组的元素类型的 ClassLoader 是一致的。类加载器有很多种,当我们想要加载一个类的时候,具体是哪个类加载器加载由。

2023-04-03 14:52:08 602

原创 JVM 垃圾回收

JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引用、软引用、弱引用、虚引用四种(引用强度逐渐减弱)强引用(Strong Reference):强引用是指程序中普遍存在的引用方式,如果一个对象具有强引用,垃圾回收器就不会回收该对象。只有当该对象不再具有任何强引用时,垃圾回收器才会回收该对象。软引用是一种相对强引用弱化的引用方式。如果一个对象只有软引用,当系统内存不足时,垃圾回收器可能会回收该对象。软引用通常用于实现内存敏感的高速缓存系统。弱引用(Weak Reference)

2023-03-31 20:20:36 397

原创 JVM 内存区域

在servivor区中,“Hotspot遍历所有对象时,按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了survivor区的一半时,取这个年龄和MaxTenuringThreshold中更小的一个值,作为新的晋升年龄阈值”。与程序计数器一样,Java 虚拟机栈(后文简称栈)也是线程私有的,它的生命周期和线程相同,随着线程的创建而创建,随着线程的死亡而死亡。:在上面工作都完成之后,从虚拟机的视角来看,一个新的对象已经产生了,但从 Java 程序的视角来看,对象创建才刚开始,

2023-03-29 22:05:34 444

原创 java并发 ThreadLocal

多线程充分利用了多核CPU的威力,为我们程序提供了很高的性能。但是有时候,我们需要多个线程互相协作,这里可能就会涉及到数据一致性的问题。数据一致性指问题的是:发生在多个主体对同一份数据无法达成共识。这里的多个主体,可能是多线程,也可能是多个服务器节点。当然了,这里的“多个主体”也可以指朋友之间,夫妻之间,所谓“道不同,不相为谋”,说的就是这个理。提供了线程局部变量,一个线程局部变量在多个线程中,分别有独立的值(副本。

2023-03-27 22:17:17 425

原创 java并发-通信工具类

Semaphore翻译过来是信号的意思。顾名思义,这个工具类提供的功能就是多个线程彼此“打信号”。而这个“信号”是一个int类型的数据,也可以看成是一种“资源”。可以在构造函数中传入初始资源总数,以及是否使用“公平”的同步器。默认情况下,是非公平的。// 默认情况下使用非公平 public Semaphore(int permits) {最主要的方法是acquire方法和release方法。acquire()方法会申请一个permit,而release方法会释放一个permit。

2023-03-25 16:29:01 333

原创 java并发 AQS

AQS是一个构建锁和同步器的框架(模板)。Semaphore,其他的诸如FutureTask等等皆是基于AQS的。我们也可以使用AQS构建符合自己需求的同步器。

2023-03-21 17:34:57 274

原创 线程池原理

但如果你及团队本身对线程池非常熟悉,又确定业务规模不会大到资源耗尽的程度(比如线程数量或任务队列长度可能达到Integer.MAX_VALUE)时,其实是可以使用JDK提供的这几个接口的,它能让我们的代码具有更强的可读性。核心线程:线程池中有两类线程,核心线程和非核心线程。创建线程的工厂 ,用于批量创建线程,统一在创建线程时设置一些参数,如是否守护线程、线程的优先级等。线程池本身有一个调度线程,这个线程就是用于管理布控整个线程池里的各种任务和事务,例如创建线程、销毁线程、任务队列管理、线程队列管理等等。

2023-03-16 22:12:03 341

原创 消息队列基础

RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件,它最初起源于金融系统,用于在分布式系统中存储转发消息。Kafka 是 LinkedIn 开源的一个分布式流式处理平台,已经成为 Apache 顶级项目,早期被用来用于处理海量的日志,后面才慢慢发展成了一款功能全面的高性能消息队列。我们可以把消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。

2023-03-09 22:05:11 313

原创 分布式锁详解

由于 Redis 集群数据同步到各个节点时是异步的,如果在 Redis 主节点获取到锁后,在没有同步到其他节点时,Redis 主节点宕机了,此时新的 Redis 主节点依然可以获取锁,所以多个应用服务就可以同时获取到锁。所谓可重入锁指的是在一个线程中可以多次获取同一把锁,比如一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法即可重入 ,而无需重新获得锁。当可重入计数器大于 0 时,则锁被占有,需要判断占有该锁的线程和请求获取锁的线程是否为同一个。

2023-03-02 21:54:28 702

原创 分布式ID实现方法

分布式 ID 是分布式系统下的 ID。分布式 ID 不存在与现实生活中,属于计算机系统中的一个概念。我简单举一个分库分表的例子。我司的一个项目,使用的是单机 MySQL。但是,没想到的是,项目上线一个月之后,随着使用人数越来越多,整个系统的数据量将越来越大。单机 MySQL 已经没办法支撑了,需要进行分库分表(推荐 Sharding-JDBC)。在分库之后, 数据遍布在不同服务器上的数据库,数据库的自增主键已经没办法满足生成的主键唯一了。我们如何为不同的数据节点生成全局唯一主键呢?这个时候就需要生成。

2023-02-27 21:14:42 419 2

原创 分布式 CAP & BASE理论

一致性(Consistency) : 所有节点访问同一份最新的数据副本可用性(Availability): 非故障的节点在合理的时间内返回合理的响应(不是错误或者超时的响应)。分区容错性(Partition tolerance) : 分布式系统出现网络分区的时候,仍然能够对外提供服务。网络分区:分布式系统中,多个节点之前的网络本来是连通的,但是因为某些故障(比如部分节点网络出了问题)某些节点之间不连通了,整个网络就分成了几块区域,这就叫网络分区。Basically Available(基本可用)

2023-02-18 10:57:56 347

原创 XXL-JOB 极简入门

XXL-JOB 是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。从它登记的接入公司列表 ,可以看到拍拍贷、优信二手车、京东、哈啰出行等知名的互联网公司正在使用中。所以,胖友们是可以放心大胆的在项目中使用。

2023-02-13 10:26:10 1053

原创 SpringBoot整合Slf4j+logback日志框架

Slf4j的全称是Simple Loging Facade For Java(Java简单日志门面),它仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如JDBC一样,只是一种规则而已。所以单独的Slf4j是不能工作的,必须搭配其他具体的日志实现方案,比如apache的org.apache.log4j.Logger,jdk自带的java.util.logging.Logger等。

2023-02-02 21:11:57 1473

原创 Java 定时任务详解

上图的时间轮,第 1 层的时间精度为 1 ,第 2 层的时间精度为 20 ,第 3 层的时间精度为 400。假如我们需要添加一个 350s 后执行的任务 A 的话(当前时间是 0s),这个任务会被放在第 2 层(因为第二层的时间跨度为 20*20=400>350)的第 350/20=17 个时间格子。当我们需要新建一个 3s 后执行的定时任务,只需要将定时任务放在下标为 3 的时间格中即可。上面提到的一些定时任务的解决方案都是在单机下执行的,适用于比较简单的定时任务场景比如每天凌晨备份一次数据。

2023-02-02 20:23:28 2625

原创 Docker核心概念总结

Docker 是世界领先的软件容器平台。Docker 使用 Google 公司推出的Go 语言进行开发实现,基于 Linux 内核 提供的 CGroup 功能和 namespace 来实现的,以及 AUFS 类的 UnionFS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。Docker 能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。

2023-01-07 17:24:50 2222 5

转载 Docker实战基础

如果你的电脑是Windows 10 64位专业版的操作系统,则在安装 Docker 之前需要开启一下Hyper-V(注意windows家庭版没有Hyper-V需要先手动下载,且如果你的电脑上之前使用过虚拟机,windows会把Hyper-V默认屏蔽掉,不然会产生冲突),开启方式如下。此时终端将会进入容器内部,执行的指令都将在容器中生效,在容器内只能执行一些比较简单的指令,如:ls、cd 等,若是想退出容器终端,重新回到 CentOS 中,则执行exit即可。是固定的,后面写上需要下载的镜像名及版本标志;

2023-01-06 17:14:43 162

原创 Mysql总结

最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

2022-12-21 14:54:49 470

原创 算法-二叉堆及优先级队列

首先,二叉堆和二叉树有啥关系呢,为什么人们总是把二叉堆画成一棵二叉树?因为,二叉堆在逻辑上其实是一种特殊的二叉树(完全二叉树),只不过存储在数组里。// 父节点的索引 int parent(int root) {} // 左孩子的索引 int left(int root) {} // 右孩子的索引 int right(int root) {}

2022-09-14 19:20:23 372

原创 算法-单调栈和单调队列

栈(stack)是很简单的一种数据结构,先进后出的逻辑顺序,符合某些问题的特点,比如说函数调用栈。单调栈实际上就是栈,只是利用了一些巧妙的逻辑,使得每次新元素入栈后,栈内的元素都保持有序(单调递增或单调递减)。

2022-09-13 22:29:10 174

原创 java 多线程总结

程序:指一段静态的代码,静态对象。进程:是程序的一次执行过程,是系统资源的最小分配单位线程:进程可进一步细化为线程,是时间片的最小分配单位并行:多个CPU同时执行多个任务,比如:多个人同时做不同的事并发:一个CPU(采用时间片)同时执行多个任务,比如秒杀平台,多个人做同件事。

2022-09-13 19:44:40 113

转载 前缀树算法模板

Trie 树又叫字典树、前缀树、单词查找树,是一种二叉树衍生出来的高级数据结构,主要应用场景是处理字符串前缀相关的操作。关于Map和Set,是两个抽象数据结构(接口),Map存储一个键值对集合,其中键不重复,Set存储一个不重复的元素集合。

2022-09-06 16:35:45 309

原创 idea打jar包与引入jar包

右键jar包,addAsLibrary,就可以正常调用了。将jar包复制进lib。

2022-07-26 19:03:28 442

原创 快速排序详解及应用

归并排序算法详解 通过二叉树的视角描述了归并排序的算法原理以及应用,那我就趁热打铁,今天继续用二叉树的视角讲一讲快速排序算法的原理以及运用。代码框架:其实你对比之后可以发现,快速排序就是一个二叉树的前序遍历:另外,前文 归并排序详解 用一句话总结了归并排序:先把左半边数组排好序,再把右半边数组排好序,然后把两半数组合并。同时我提了一个问题,让你一句话总结快速排序,这里说一下我的答案:快速排序是先将一个元素排好序,然后再将剩下的元素排好序。从二叉树的视角,我们可以把子数组 理解成二叉树节点上的值,sro

2022-07-08 17:21:03 585

转载 二叉搜索树(构造篇)

二叉搜索树(特性篇)讲了中序遍历对 BST 的重要意义,二叉搜索树(基操篇)写了 BST 的基本操作。本文循序渐进地讲两道题,如何计算所有有效 BST。力扣第 96 题「 不同的二叉搜索树」固定一个根节点后,其形状总数为左子树的组合数和右子树的组合数乘积注意 base case,显然当闭区间肯定是个空区间,也就对应着空节点 null,虽然是空节点,但是也是一种情况,所以要返回 1 而不能返回 0。但是这样会出现很多重叠子问题,这时就需要备忘录来记录已经访问过的组合当然这道题动态规划也可以解决不同的二

2022-07-07 21:27:11 993

转载 二叉搜索树(基操篇)

二叉搜索树(特性篇)介绍了 BST 的基本特性,还利用二叉搜索树「中序遍历有序」的特性来解决了几道题目,本文来实现 BST 的基础操作:判断 BST 的合法性、增、删、查。其中「删」和「判断合法性」略微复杂。BST 的基础操作主要依赖「左小右大」的特性,可以在二叉树中做类似二分搜索的操作,寻找一个元素的效率很高。比如下面这就是一棵合法的二叉树:对于 BST 相关的问题,你可能会经常看到类似下面这样的代码逻辑:一、判断 BST 的合法性力扣第 98 题「 验证二叉搜索树」就是让你判断输入的 BST 是

2022-07-06 21:47:36 303

转载 二叉搜索树(特性篇)

二叉搜索树并不算复杂,但我觉得它可以算是数据结构领域的半壁江山,直接基于 BST 的数据结构有 AVL 树,红黑树等等,拥有了自平衡性质,可以提供 logN 级别的增删查改效率;还有 B+ 树,线段树等结构都是基于 BST 的思想来设计的。从做算法题的角度来看 BST,除了它的定义,还有一个重要的性质:BST 的中序遍历结果是有序的(升序)。也就是说,如果输入一棵 BST,以下代码可以将 BST 中每个节点的值升序打印出来:寻找第 K 小的元素力扣第 230 题「 二叉搜索树中第 K 小的元素」,一个

2022-07-06 20:50:17 326

原创 Windows openssl自建CA并分发证书(ECC)

需要下载安装openssl,并将其添加进path确保openssl可以使用后,列出可用ECC曲线我们使用生成秘钥对。使用 生成证书我们需要使用证书来签名服务器和客户端的证书,使用私钥生成根证书,为此我们创建几个目录,用来存储证书,秘钥,索引数据任意创建一个文件夹,这里随意命名位tls然后在该文件夹里创建如上图圈出文件/文件夹,其他都是后面命令自动生成的命令行进入自己创建的文件夹生成CA ECC私钥⽣成秘钥时,openssl默认仅存储曲线的名字:生成CA证书使用上一步生成的CA私钥,生成CA证书接

2022-07-06 15:36:38 3499

原创 Base64编码(java)

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来标识二进制数据的方法。Base64是一种可逆的编码方式,是一种用64个Ascii字符来表示任意二进制数据的方法。主要用于将不可打印字符转换为可打印字符,或者简单的说将二进制数据编码为Ascii字符,...

2022-07-04 16:48:15 4894

转载 归并排序详解及应用

就这么说吧,所有递归的算法,你甭管它是干什么的,本质上都是在遍历一棵(递归)树,然后在节点(前中后序位置)上执行代码,你要写递归算法,本质上就是要告诉每个节点需要做什么。你看归并排序的代码框架:看这个框架,也就明白那句经典的总结:归并排序就是先把左半边数组排好序,再把右半边数组排好序,然后把两半数组合并。上述代码和二叉树的后序遍历很像:前文 二叉树(纲领篇) 说二叉树问题可以分为两类思路,一类是遍历一遍二叉树的思路,另一类是分解问题的思路,根据上述类比,显然归并排序利用的是分解问题的思路归并排序的过程可

2022-07-01 18:45:36 642

原创 OpenSSL 在Windows的安装

VC++:ActivePerl 5NASM进入OpenSSL源代码主目录,执行:配置成功图例:若这里报错:解决方法:找到目录下的文件,注释下面代码,大约在393行开始。再次执行命令即可这一步执行的时间较长,实际是VC 的 cl.exe命令编译链接的过程。执行结果:编译前后目录变化:上一步生成了重要的库文件:执行命令测试库文件的正确性:执行结果:执行命令:默认安装目录:执行结果:...

2022-06-29 17:16:31 3140

转载 二叉树(序列化篇)

JSON 的运用非常广泛,比如我们经常将变成语言中的结构体序列化成 JSON 字符串,存入缓存或者通过网络发送给远端服务,消费者接受 JSON 字符串然后进行反序列化,就可以得到原始数据了。这就是「序列化」和「反序列化」的目的,以某种固定格式组织字符串,使得数据可以独立于编程语言。本文会用前序、中序、后序遍历的方式来序列化和反序列化二叉树,进一步,还会用迭代式的层级遍历来解决这个问题。力扣第 297 题「 二叉树的序列化与反序列化」就是给你输入一棵二叉树的根节点 ,要求你实现如下一个类:二、前序遍历解法

2022-06-05 22:00:06 1431

转载 二叉树(构造篇)

二叉树(纲领篇),先复述一下前文总结的二叉树解题总纲:二叉树的构造问题一般都是使用「分解问题」的思路:构造整棵树 = 根节点 + 构造左子树 + 构造右子树。力扣第 654 题「 最大二叉树」每个二叉树节点都可以认为是一棵子树的根节点,对于根节点,首先要做的当然是把想办法把自己先构造出来,然后想办法构造自己的左右子树。所以,我们要遍历数组把找到最大值 ,从而把根节点 做出来,然后对 左边的数组和右边的数组进行递归构建,作为 的左右子树。通过前序和中序遍历结果构造二叉树力扣第 105 题「 从前

2022-06-05 20:52:35 5797

转载 二叉树(思路篇)

承接二叉树(纲领篇),先复述一下前文总结的二叉树解题总纲:本文就以几道比较简单的题目为例,带你实践运用这几条总纲,理解「遍历」的思维和「分解问题」的思维有何区别和联系。力扣第 226 题「 翻转二叉树」不难发现,只要把二叉树上的每一个节点的左右子节点进行交换,最后的结果就是完全翻转之后的二叉树。那么现在开始在心中默念二叉树解题总纲:1、这题能不能用「遍历」的思维模式解决?可以,我写一个 traverse 函数遍历每个节点,让每个节点的左右子节点颠倒过来就行了。单独抽出一个节点,需要让它做什么?让它把自己

2022-06-04 17:46:13 418

转载 二叉树(纲领篇)

先在开头总结一下,二叉树解题的思维模式分两类:无论使用哪种思维模式,你都需要思考:如果单独抽出一个二叉树节点,它需要做什么事情?需要在什么时候(前/中/后序位置)做?其他的节点不用你操心,递归函数会帮你在所有节点上执行相同的操作。举个例子,比如两个经典排序算法 快速排序 和 归并排序,对于它俩,你有什么理解?如果你告诉我,快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历,那么我就知道你是个算法高手了。为什么快速排序和归并排序能和二叉树扯上关系?我们来简单分析一下他们的算法思想和代码框架:快速排

2022-06-04 15:05:38 288

原创 常数时间删除/查找数组中的任意元素

文章目录实现随机集合避开黑名单的随机数实现随机集合这是力扣第 380 题「 常数时间插入、删除和获取随机元素」,看下题目:就是让我们实现如下一个类:class RandomizedSet {public: /** 如果 val 不存在集合中,则插入并返回 true,否则直接返回 false */ bool insert(int val) {} /** 如果 val 在集合中,则删除并返回 true,否则直接返回 false */ bool remove

2022-05-28 20:29:08 205

原创 什么时候运用二分搜索

文章目录原始的二分搜索代码二分搜索问题的泛化运用二分搜索的套路框架在二分搜索算法框架解析中,详细介绍了二分搜索的细节问题,探讨了「搜索一个元素」,「搜索左侧边界」,「搜索右侧边界」这三个情况,教你如何写出正确无 bug 的二分搜索算法。但是前文总结的二分搜索代码框架仅仅局限于「在有序数组中搜索指定元素」这个基本场景,具体的算法问题没有这么直接,可能你都很难看出这个问题能够用到二分搜索。所以本文就来总结一套二分搜索算法运用的框架套路,帮你在遇到二分搜索算法相关的实际问题时,能够有条理地思考分析,步步为营

2022-05-25 22:06:02 254

原创 数组——二维数组的花式遍历技巧

文章目录顺/逆时针旋转矩阵矩阵的螺旋遍历顺/逆时针旋转矩阵对二维数组进行旋转是常见的笔试题,力扣第 48 题「 旋转图像」就是很经典的一道:题目很好理解,就是让你将一个二维矩阵顺时针旋转 90 度,难点在于要「原地」修改在讲巧妙解法之前,我们先看另一道谷歌曾经考过的算法题热热身:给你一个包含若干单词和空格的字符串 s,请你写一个算法,原地反转所有单词的顺序。比如说,给你输入这样一个字符串:s = "hello world labuladong"你的算法需要原地反转这个字符串中的单词顺序:

2022-05-24 20:25:46 514 1

转载 数组——小而美的算法技巧:差分数组

文章目录算法实践本文讲一个和前缀和思想非常类似的算法技巧「差分数组」,差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减。比如说,我给你输入一个数组 nums,然后又要求给区间 nums[2..6] 全部加 1,再给 nums[3..9] 全部减 3,再给 nums[0..4] 全部加 2,再给…一通操作猛如虎,然后问你,最后 nums 数组的值是什么?常规的思路很容易,你让我给区间 nums[i..j] 加上 val,那我就一个 for 循环给它们都加上呗,还能咋样?这种思路的时间复杂

2022-05-24 17:29:33 378

PDF攻击实例-USF-ISA-SWA-Shadow Attack.7z

PDF攻击实例-USF-ISA-SWA-Shadow Attack.7z

2021-05-03

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除