自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(122)
  • 收藏
  • 关注

原创 【python 3.9.18】windowns安装版

在编译过程中,需要使用的sphinx应该大于等于5.0.0,我这里修改成了。最终文件会在%BasePath%\PCbuild\amd64生成exe文件。2、修改配置文件requirements.txt。

2024-02-22 15:28:38 742

原创 线程池源码学习(一)

都知道,线程池主要是对线程的管理,也便于我们去进行使用,面试也是经常性的提到,但是在我实习的过程中,却很少看到有使用的地方。其实线程池的链路挺长的,父级的接口就有两个。一级一级看吧,先看Executor,这个接口只有一个定义,也是最重要的一部分我们的所有线程都是通过这个execute()方法进行执行的。在来看下Executor的一个“服务类”,这里面涉及到的方法就有很多了,比如我们最常见的submit、shutdown等等。

2022-09-28 10:04:41 273 1

原创 微信跳转APP最全解析

微信跳转APP问题总结

2022-04-09 23:06:29 18192 3

原创 VM虚拟机CentOS8中IP变127.0.0.1最有效的解决方案

虚拟机其实主要是我们适用于想学习,但是又没有Linux环境或者说,没有买服务器的钱的时候来使用的。对于虚拟机IP变为127.0.0.1这种情况,基本上也可以说是我们无法连接到外网了,借助ssh也无法连接,这个时候相当于独立的电脑,没有任何的信息交互。我看到过网上很多的解决方案,比如使用vi /etc/sysconfig/network-scripsts/ifcfg-ens33 编辑文件中的 ONBOOT=no 要改为ONBOOT=yes 默认是ONBOOT=no,它打意思是:是否随网络服务启动

2022-01-02 21:28:18 3654 2

原创 Redis入门到入坑(三)

SpringBoot整合key失效监听整合key失效监听其实很简单,我们只需要自行注入bean即可完成。首先需要更改redis.conf的配置,打开key监听——>notify-keyspace-events "Ex"

2021-12-04 22:06:17 434

原创 Redis入门到入坑(二)

前面提到了对象的存储使用到的为JSON,现在我们也可以使用二进制进行对象的存储。代码:@Componentpublic class RedisUtils { @Resource private RedisTemplate<String, Object> redisTemplate; public void setObject(String key, Object object) { redisTemplate.opsForValue().se.

2021-12-03 22:34:30 548

原创 Redis入门到入坑(一)

1.Redis概念Redis 是完全开源免费的,是一个高性能的key-value非关系型数据库。2.Redis的应用场景1)Token令牌的生成2)短信验证码Code3)缓存查询数据4)网页计数器5)分布式锁6)延迟操作(主要体现在订单支付中的未支付和已支付的过程)3.Redis环境安装linux注意:本文章不提供redis在win环境下安装的操作,因为Redis官方并未提供win版本1.在/usr文件夹下创建redis文件夹mkdir /usr/redis2.使用Fil

2021-12-03 15:57:12 560

原创 并发编程------并发队列实现消息中间件

项目地址JUC_11什么是消息中间件MQ消息中间件,生产者将消息发送给MQ服务器端缓存起来,MQ将消息内容转发给MQ消费者。package disnetwork;import org.apache.commons.lang3.StringUtils;import java.util.concurrent.LinkedBlockingQueue;/** * @author 龙小虬 * @date 2021/5/6 22:28 */public class MQServer {

2021-05-07 15:36:32 86

原创 并发编程------ForkJoin

了解ForkJoin之前,先来了解一下stream()方法。ArrayList<String> strings = new ArrayList<String>();Stream<String> stream = strings.stream();Stream<String> stringStream = strings.parallelStream();上面的代码有着parallelStream()、stream()两个方法。他们分别代表着可多线程遍

2021-05-06 17:03:21 70

原创 并发编程------Threadlocal

ThreadlocalThreadLocal是Thread的局部变量,用于编多线程程序。Threadlocal是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据。为什么要使用Threadlocal从上面的定义可以了解到,他可以保证数据变成局部变量,这样也就保证了数据的不共享。那么使用方法是怎样的?import sun.misc.Launcher;import java.io.BufferedReader;import java.io.IOExcep

2021-05-06 12:30:19 95

原创 并发编程------线程池

线程池线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。为什么要使用线程

2021-04-30 12:40:17 95

原创 java算法训练------比特位计数、字符串解码

比特位计数给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]示例 2:输入: 5输出: [0,1,1,2,1,2]思路:都知道二进制数,主要靠的就是最后一位来控制整数是奇数还是偶数,每一个偶数/2的二进制中1的个数为偶数的二进制中1的个数,比如:4: 01008: 1000这里可以看出来他们的1的个数是一样的,由此,可以直接递推。sum[m]=sum[m/2

2021-04-29 23:45:41 141

原创 并发编程------CountDownLatch、Semaphore

加粗样式CountDownLatch在多线程并发编程中充当一个计数器的功能,并且维护一个count的变量,并且count变量的更改是原子操作,该类主要通过countDown()和await()两个方法实现功能的,首先通过建立CountDownLatch对象,并且传入参数即为count初始值。如果一个线程调用了await()方法,那么这个线程便进入阻塞状态,并进入阻塞队列。如果一个线程调用了countDown()方法,则会使count-1,并且使用原子操作更改数据;当count的值为0时,这时候阻塞队列中调

2021-04-29 17:15:42 171

原创 并发编程------ReentrantLock源码(二)

在前面我们提到了ReentrantLock的公平锁和非公平锁的使用,还有锁的释放和获取。我们之前也了解过synchronized,他是有着锁池和等待池的,也就是说他有着线程竞争锁失败的线程池,也有着手动将线程阻塞的调用方法,在ReentrantLock中,上面一章我们也了解了有着竞争锁的线程池,是利用双向链表存储的,其实ReentrantLock也有着手动阻塞的方法调用。这一章,我们就来了解一下它(Condition)。ConditionCondition是在java 1.5中才出现的,它用来替代传统

2021-04-29 11:25:10 47 1

原创 并发编程------ReentrantLock源码(一)

在前面的并发编程------CAS提到了手写lock锁,那我们现在来看看ReentrantLock的源码。以下代码是查看的ReentrantLock(false),也就是非公平锁ReentrantLockReentrantLock属于重入锁,先来看看他的无参构造方法。可以看到默认为非公平锁,那么我们今天主讲非公平锁。那我们要怎么才能使用公平锁?其实很简单:这个有参构造可以看到,只要参数为true,则创建的就是公平锁,为什么主讲非公平锁?因为他的效率比公平锁高。因为我们使用的CPU资源去运行线

2021-04-29 01:27:54 225

原创 并发编程------AQS(一)

AQS是AbstractQueuedSynchronizer的简称。AQS提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架,如下图所示。AQS为一系列同步器依赖于一个单独的原子变量(state)的同步器提供了一个非常有用的基础。子类们必须定义改变state变量的protected方法,这些方法定义了state是如何被获取或释放的。鉴于此,本类中的其他方法执行所有的排队和阻塞机制。子类也可以维护其他的state变量,但是为了保证同步,必须原子地操作这些变量。上面也提到了,他是并发中的同步队列

2021-04-26 21:37:00 87

原创 java算法训练------ LeetCode 精选 TOP 面试题------寻找重复数、逆波兰表达式求值

寻找重复数给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。示例 1:输入:nums = [1,3,4,2,2]输出:2示例 2:输入:nums = [3,1,3,4,2]输出:3示例 3:输入:nums = [1,1]输出:1示例 4:输入:nums = [1,1,2]输出:1提示:2 <= n <= 3 * 10

2021-04-26 14:18:03 100

原创 java算法训练------ LeetCode 精选 TOP 面试题------电话号码的字母组合、解码方法

电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例 1:输入:digits = "23"输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]示例 2:输入:digits = ""输出:[]示例 3:输入:digits = "2"输出:["a","b","c"]提示:0 <= digits.l

2021-04-26 14:12:06 199

原创 并发编程------synchronized(二)

我们一直都会看到有人说synchronized是重量级锁,其实并不然,这取决于是在什么情况,在jdk1.6之后,synchronized做出了优化,最后通过不同的情况使用不同的锁,一共有三种情况,也就是三种锁。1.偏向锁偏袒一个线程,当一个线程获取到锁之后,会在锁的对象头中会记录该线程的id,下次再进入到该同步代码块的时候,不需要再重复的加锁CAS操作和解锁,从而提高效率,整个过程简单理解为就是偏向锁。代码示例:import sun.applet.Main;/** * @author 龙小虬

2021-04-26 00:10:15 52

原创 java算法训练------ LeetCode 精选 TOP 面试题------括号生成、在排序数组中查找元素的第一个和最后一个位置

括号生成数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]提示:1 <= n <= 8思路:利用回溯方法,这很类似与全排列,但是他的右括号需要根据左括号来判断,这是一个最重要的点。代码:ArrayList list;StringBuilder string

2021-04-25 00:20:45 144

原创 java算法训练------ LeetCode 精选 TOP 面试题------二叉树的层序遍历、二叉树的中序遍历

二叉树的层序遍历给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层序遍历结果:[ [3], [9,20], [15,7]]思路:我们可以看到他的树结构,遍历的结果是第一层、第二层…这也让我们知道了,将会遍历根节点,然后就是左节点、右节点。代码:List<List<Integ

2021-04-25 00:13:35 80

原创 并发编程------synchronized(一)

synchronized主要是用于遇到线程安全时的时候使用。synchronized关联到的锁对象有几种?对象锁synchronized 加到非静态方法前面是给对象上锁,或者自定义的对象。类锁synchronized 加到 static 方法前面是给class 加锁在后面我们再来解释两者的具体区别。汇编中的synchronized代码:/** * @author 龙小虬 * @date 2021/4/24 23:06 */public class Main exte

2021-04-25 00:05:27 115

原创 并发编程------CAS

CASCAS是C++写的,底层已经实现了原子性,所以需要使用UnSafe类,UnSafe类中使用jni技术来调用CAS中的compareAndSet,所以我们在 java只能看到compareAndSwapObject、compareAndSwapInt、compareAndSwapLong这三个方法是有四个参数,而第一个就是需要改变的对象(也就是this),后面两个可以分为E,N(前两个合并就是V)。当且仅当V=E时,将V=NV:内存值(共享变量)E:旧预值(工作内存)N:新值(修改后的值)在前

2021-04-23 14:00:11 144

原创 并发编程------锁的分析

锁的意义涉及到线程安全问题会使用锁,当多个线程在同时共享到同一个全局变量的时候,可能会受到其他线程干扰。一般只在写的操作上锁悲观锁与乐观锁1.悲观锁每次在执行同步代码块的时候都会去获取锁,如果没有获取到锁的情况下,当前线程进入阻塞状态,效率比较低。如果获取到锁,就需要从阻塞–>就绪,会有阻塞超时和等待锁。应用场景:synchronizedmysql行锁Lock锁在这里我们就利用mysql行锁来说明吧。在这之前我们需要了解一下事务。事务: 主要保证数据的一致性,遵循acid原

2021-04-23 09:27:28 76

原创 并发编程------volatile原理分析(二)

项目地址JUC_02前面提到了volatile底层锁使用的是MESI缓存一致性协议和总线锁,那么我们也就理解了他的底层实现原理是通过汇编指令lock前缀指令触发到底层锁来实现。前面提到过,volatile不能保证原子性,那为什么不能保证原子性呢?我们来看看代码的解释。为什么volatile不能保证原子性再次之前,我们先了解原子性:即一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。import java.util.ArrayList;/** * @auth

2021-04-22 12:50:06 93

原创 java算法训练------ LeetCode 精选 TOP 面试题------最大数、合并区间

最大数给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。示例 1:输入:nums = [10,2]输出:"210"示例 2:输入:nums = [3,30,34,5,9]输出:"9534330"示例 3:输入:nums = [1]输出:"1"示例 4:输入:nums = [10]输出:"10"提示:1 <= nums.length <= 1000 &lt

2021-04-22 01:00:39 152

原创 java算法训练------ LeetCode 精选 TOP 面试题------打乱数组、被围绕的区域

打乱数组给你一个整数数组 nums ,设计算法来打乱一个没有重复元素的数组。实现 Solution class:Solution(int[] nums) 使用整数数组 nums 初始化对象int[] reset() 重设数组到它的初始状态并返回int[] shuffle() 返回数组随机打乱后的结果示例:输入["Solution", "shuffle", "reset", "shuffle"][[[1, 2, 3]], [], [], []]输出[null, [3, 1, 2],

2021-04-21 17:05:00 64

原创 java算法训练------ LeetCode 精选 TOP 面试题------搜索二维矩阵 II、矩阵置零

搜索二维矩阵 II编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。示例 1:输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5输出:true示例 2:输入:matrix = [[1,4,7,11,15],

2021-04-21 16:56:12 120

原创 java算法训练------ LeetCode 精选 TOP 面试题------Pow(x, n)、删除链表的倒数第 N 个结点

Pow(x, n)实现 pow(x, n) ,即计算 x 的 n 次幂函数。示例 1:输入:x = 2.00000, n = 10输出:1024.00000示例 2:输入:x = 2.10000, n = 3输出:9.26100示例 3:输入:x = 2.00000, n = -2输出:0.25000解释:2-2 = 1/22 = 1/4 = 0.25提示:-100.0 < x < 100.0-2^31 <= n <= 2^31-1-104 &lt

2021-04-21 16:40:45 107

原创 java算法训练------ LeetCode 精选 TOP 面试题------两整数之和、颜色分类

两整数之和不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a 、b ​​​​​​​之和。示例 1:输入: a = 1, b = 2输出: 3示例 2:输入: a = -2, b = 3输出: 1思路:既然不能使用+、-,我们知道位运算、与运算、异或运算可以进行简单的乘除,那么肯定就可以写出+、-,并且效率比使用+、-更加快。直接使用位运算计算即可代码:public int getSum(int a, int b) { while(b != 0){

2021-04-21 00:10:23 59

原创 并发编程------volatile原理分析(一)

想要了解volatile之前,先去回顾一下多线程,多线程存在的意义?提高我们Http协议响应效率,能够对用户有一个比较好的体验。或者说提高程序的效率。那么怎么理解多核多线程。多核多线程如果是单核的CPU(默认情况下,一核两个线程)情况下,cpu在同一个时刻只能执行一个线程,所以存在切换过程,并不是真正的多线程,所以多核多线程需要的是多核cpu,少量的cpu切换多线程的五个状态创建就绪阻塞运行死亡volatile原理分析什么是 Volatile能够保证线程可见性,当一个线程修改共享变

2021-04-20 23:51:58 89 2

原创 java算法训练------ LeetCode 精选 TOP 面试题------前 K 个高频元素、有效的数独

前 K 个高频元素给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]提示:1 <= nums.length <= 105k 的取值范围是 [1, 数组中不相同的元素的个数]题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的思路:

2021-04-20 18:57:34 361

原创 JVM性能优化------三色标记算法原理

什么是三色标记算法jvm垃圾回收期使用的,在并行标记的时候的一种算法,CMS/G1中的核心算法。把对象从逻辑上分为三种颜色,分别是黑色,灰色,白色黑色:自身和成员变量均已标记灰色:自身被标记,成员变量未被标记白色:未被标记的对象它主要用于收集器内存管理,适用于任何的垃圾收集器,也就是通用的算法。我们通过G1回收器来了解这个算法,我们都知道G1收集器分为三个步骤新生代回收过程当新生代eden区内存满的时候,G1年轻代收集器会采用并行多线程的方式清理堆内存垃圾,这时候会暂停所有用户的线程

2021-04-20 18:27:41 400

原创 JVM性能优化------垃圾回收器(三)

现在来讲讲G1收集器。在前面的文章晒出了一张图片,G1收集器处于老年代和新生代之间。那么这个新晋升的收集器,到底怎么样。讲G1收集器之前,我们再来回顾一下CMS收集器和传统收集器的缺点。CMS收集器和传统收集器的缺点1.碎片化问题2.标记清除算法会产生大量的碎片化的问题,如果存放一个大对象的时候,有可能会频繁的引发FullGC 使用串行老年代收集器单线程清理堆内存垃圾,触发stw问题,导致工作线程全部阻塞等待3.存放大对象如果在新生代无法存放,则会晋升到老年代存放,但是如果大对象又不是被频繁引用,而

2021-04-20 00:05:08 76

原创 JVM性能优化------垃圾回收器(二)

上一篇文章已经了解了传统的垃圾回收器和CMS回收器。但是关于CMS回收器的一些知识并未全部概述。我们都知道,在并发清除的时候,用户线程和GC线程是可以同时运行的,但是在这清除的过程中可能还会产生垃圾对象。这些垃圾对象,无法在本次垃圾清理的时候清理掉,这些垃圾也有一个名字,叫做:浮动垃圾。浮动垃圾CMS将无法对这些垃圾对象进行标记,由于GC线程与用户线程同时运行,最终会导致这些新产生的垃圾对象,没有被及时的回收,从而只能在下一次执行GC时释放这些之前未被回收的对象。这些垃圾也就是浮动垃圾。触发stw机

2021-04-19 21:52:43 137

原创 JVM性能优化------垃圾回收器(一)

前面我们使用到了System.gc();方法,可以回收垃圾。那么他具体是怎样的呢?我们来看看吧。可以看到他是C语言写的,但我现在要说的是,我们调用了System.gc();的话,垃圾并不是立马回收,而是告诉虚拟机需要进行回收了。测试代码:/** * @author 龙小虬 * @date 2021/4/16 22:54 */public class SystemGC { public static void main(String[] args) { new Sy

2021-04-16 23:57:43 393 3

原创 java算法训练------ LeetCode 精选 TOP 面试题------验证二叉搜索树、摆动排序 II

验证二叉搜索树给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入: 2 / \ 1 3输出: true示例 2:输入: 5 / \ 1 4 / \ 3 6输出: false解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为

2021-04-16 12:45:50 69

原创 java算法训练------ LeetCode 精选 TOP 面试题------旋转图像、旋转数组

旋转图像给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]示例 2:输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]输出:[[15,13

2021-04-16 00:07:02 117 1

原创 JVM性能优化------垃圾回收算法

在前面的文章JVM性能优化------可达性分析算法与四种引用,提到过四种算法。但是只是提了一下概念。今天我们来具体理解一下。回收算法先提及一个最大的误区,引用计数算法,在java并没有使用,而是python的回收算法!!!好了,现在我们看看java的四种回收算法。标记清除算法我们可以看到堆内存中有A、B、C、D、E、F六个对象,当B、C、E对象不再被引用的时候,那么会被直接标记,在需要回收时,进行回收。我们可以看到右边的堆内存的结构,幸存的对象的地址不是连续的,那么会产生碎片化的问题,一旦

2021-04-15 23:26:25 90

原创 java算法训练------ LeetCode 精选 TOP 面试题------单词搜索、单词拆分

单词搜索给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例 1:输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"输出:true示例

2021-04-15 14:55:00 122

空空如也

空空如也

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

TA关注的人

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