- 博客(268)
- 资源 (1)
- 收藏
- 关注

原创 JUC框架 源码解析系列文章目录 JDK8
前言笔者在接下来这段时间将对JUC框架内的重点内容进行深度解析,由于内容颇多,需要分成多篇文章,所以在这里列一个目录,方便大家翻阅。目录JUC框架的基础是CAS和自旋,而CAS则是利用Unsafe类提供的CAS操作,而原子类则依靠于CAS和自旋。下面几篇文章从源码分析JUC框架内的几个重要的原子类。JUC AtomicInteger源码解析 JDK8JUC AtomicIntegerArray源码解析 JDK8JUC AtomicStampedReference源码解析 JDK8AQS(A
2020-06-07 11:37:05
8633
13
原创 语雀 添加块级模式公式
点击公式,在公式内填入:效果如下:但这种方式的居中对齐,行间距很窄。默认是靠右对齐的。实际是这里是根据每行的来对齐的,这里都放到最左边,所以是靠左对齐的效果。调整的位置,可以达到其他的自定义的对齐效果。...............
2022-06-14 15:26:37
1736
1
原创 Sublime3 设置ctrl+鼠标左键跳转到方法
前提条件安装Package Control安装插件Sublime3的Ctags点击Project ⇒ Add Folder to Project,添加项目文件夹在项目文件夹根目录点击Ctags:Rebuild Tags设置快捷键进入Preferens ⇒ Package Settings ⇒ Ctags ⇒ Mouse Bindings - User把默认的"modifiers":["ctrl","shift"]改成只有"modifiers":["ctrl"]。注意,Preferens
2022-06-09 15:05:10
785
1
原创 Sublime3 离线安装package control
下载https://packagecontrol.io/installation点击如上红框下载。安装将这个文件放到Sublime/Data/Installed Packages/文件夹下然后按照Preferences > Browse Packages…点击到这个Installed Packages/文件夹里(最好是选中这个下载的文件)重启sublime............
2022-06-09 15:01:50
855
原创 Windows下 VsCode安装C++ Intellisense以及使用
文章目录安装GNU Global安装C++ Intellisense在文件夹运行gtags查看定义安装GNU Global进入官网https://www.gnu.org/software/global/download.html下载专区下载Windows安装包。下载最新版本的win32安装包,如上图所示。下载下来是一个压缩包,将其解压,如上图。将bin文件夹的路径添加到Path环境变量中去,如上图。安装C++ Intellisense安装好这个vscode的插件,最后记得重启vscod
2022-05-16 17:53:44
5184
原创 VsCode中 如何写markdown文档
插件下载插件介绍Markdown All in One为写作Markdown的语法提供了一些快捷键。Markdown Preview Enhanced为markdown文档提供了预览功能。常用快捷键功能为 ctrl + shift + v,新开一个窗口进行预览。也可以点击这个图标进行分屏预览。Markdown PDF可以将markdown文档转为pdf。在文档空白处右键即可。Paste Image用来复制 粘贴板里的图片到本地目录下。${currentFileDir
2022-05-12 19:47:59
1967
原创 Windows下 使用Python来调用PotPlayer.exe来播放音频
使用cmd如上cmd里直接输入C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe的话,会被空格隔开,导致识别为空格之前的部分。"C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe"cmd里输入如上命令,会打开空白的potplayer。"C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe" "C:\1.wav""C:\Program File
2021-12-28 18:17:59
4500
1
原创 TCP/IP协议详解卷一 第13章 TCP连接管理 知识点浅析
TCP连接的建立与终止一个TCP连接是由一个4元祖构成的,即两个IP地址,连个端口号。更准确地说,一个TCP连接是由一对端点或套接字构成,其中通信的每一端都由一对(IP地址,端口号)所唯一标识。一个TCP连接通常分为3个阶段:建立连接、数据传输(连接已建立)、关闭连接。下面描述一次TCP连接的建立和关闭过程。连接过程:客户端发送一个SYN报文段(即一个在TCP头部的SYN位字段置位的TCP/IP数据包),并指明自己想要连接的端口号和它的客户端初始序列号(记为ISN©)。服务器接收到客户端发送的S
2021-12-26 22:15:34
1965
原创 VS工程中报错 常量中有换行符
环境window10简体中文,所以系统环境是:GB2312,代码页936。vs工程中没有设置 源字符串集,即没有设置/source-charset,当然也没有设置 /utf-8。(另外,vs工程中,也可以单独对某个文件进行 字符集 设置的。也没有进行这样的设置)工程中大部分的文件都是按照GB2312编码来存储的。问题产生此时工程中添加了一个utf-8编码来存储的文件。文件有一行std::string sss = "廿";然后编译报错:常量中有换行符。问题解决解决方法当然就是把这个特殊文件
2021-12-23 17:02:45
8710
3
原创 TCP/UDP伪头部讲解
前言我们知道IPv4的校验和只覆盖IP协议的头部,它每经过一个路由器都要重新计算IP协议的校验和,因为IPv4有一个TTL字段每经过一个路由器都要减1。而传输层协议(TCP和UDP)的校验和是覆盖它们的头部和数据的。UDP伪头部以UDP的伪头部为例讲解:最后的单个填充字节因为校验和算法是以16bit为单位的,但UDP数据报长度可以是奇数个字节,所以如果整个UDP分组是奇数个字节,那么会虚拟地加上最后一个字节(如上图,最后一个字节),用以保证能有偶数个字节。但这个虚拟的最后这个字节,不会真的被传
2021-11-29 23:52:50
4159
原创 wireshark 抓包ARP分组
从下图的报文数据的结构来看,ARP协议属于是网络层协议,因为它被封装在了以太网帧中(从包封装的角度来讲)。但从功能上来说,ARP是为了获得获取到MAC地址,所以也可以说是属于链路层协议。Who has 192.168.0.1? Tell 192.168.0.101。翻译过来就是,谁是192.168.0.1,请告诉我192.168.0.101。从ARP的字段上看,7e:90:3c:47:04:0a这个设备和192.168.0.101绑定在了一起,它想知道192.168.0.1的MAC地址是什么,所以Ta
2021-11-23 22:38:52
7070
1
原创 深入理解 原码,反码,补码——证明补码等于反码加1
负数的补码等于反码+1。(这只是一种算补码的方式)负数的补码等于他的原码自低位向高位,尾数的第一个‘1’及其右边的‘0’保持不变,左边的各位按位取反,符号位不变。
2021-11-22 21:37:51
6945
9
原创 draw.io 表格添加行列
基本操作如上图,点击生成如上表格单击表格,会出现。依次是:左侧插入列。如果选中的是整个表格,则在最左侧添加。如果选中的是某个单元格,则在这个单元格所在列的左侧,添加列。右侧插入列。删除列。如果选中的是某个单元格,则删除这个单元格所在列。如果选中的是整个表格,则删除最右,怀疑原因是从左到右,所以删右。左侧插入行。右侧插入行。删除行。如果选中的是整个表格,则删除最下,怀疑原因是从上到下,所以删下。如何选中第一次单击表格,则选中整个表格。选中整个表格的基础上,再单击某个单元格
2021-11-21 19:49:59
10488
原创 计算机网络自顶向下.6e 第4章 网络层 知识点浅析
前言与应用层和运输层不同的是,在网络中的每一台路由器或主机中都有一个网络层部分。当然,如上图,如果有了网络层,那也必然会有下面的数据链路层和物理层。所以,路由器不会运行 应用层、运输层协议。概述转发和路由选择网络层的作用从表面上很简单,就是把分组从一台发送主机(电脑或路由器)移动到一台接收主机。为此,需要两种功能:转发(forwarding)。当一个分组到达路由器的一条输入链路时,路由器必须将该分组移动到适合的输出链路上去。这是一个路由器的本地动作。路由选择(routing)。当一个分组从发
2021-11-17 21:25:01
1046
原创 计算机网络 对Reno算法的优化——NewReno算法
实例分析Reno和NewReno我们假设当前处于拥塞避免状态。如下图,[0-11]的这个窗口内的12个数据包从发送方发送。不过1、4数据包还没到达接收方就丢失了。一般情况下,发送方发送了seq=0,len=1的数据包后,接收方回复的ACK包为ack=1,代表接收方接下来期待的是序号seq从1的数据包。但本节例子为了简便表示,发送方发送了Data[0]后,接收方回复的是ACK[0],但代表的同样是 接收方接下来期待的是Data[1]以及以后的数据。Reno的不足之处收到的第一个ACK[0.
2021-10-22 01:02:46
1350
2
原创 浅析——为什么UTF-16需要大端小端,而UTF-8不需要
由于UTF-16的设计,直接给我们两个字节,我们并不能知道哪个字节是数据高位、哪个字节是数据低位。正如同上面的例子一样,4F既能作为高位,也能作为低位。
2021-10-15 00:07:07
1770
3
原创 Visual Studio 2019 常用快捷键
Shift+Alt+. 选中下一个相同文本Shift+Alt+; 选择所有相同文本Shift+Alt+/ 跳过下一个相同文本Shift+Alt+, 移除最后一个相同文本
2021-10-14 16:24:17
440
原创 Ubuntu16 通过gdebi安装搜狗输入法
环境Ubuntu16.04 LTS已安装好了gdebi。去搜狗输入法官网下载了搜狗输入法的deb包(我的是sogoupinyin_2.4.0.3469_amd64.deb)。输入法系统选择需要选择为fcitx,一般默认就是这个了。安装过程右键单击搜狗输入法deb包,使用gdebi打开。点击Install Package。点击安装后,出现上图。然后按照提示在终端执行sudo apt-get install -f。此时再通过gdebi右键,发现gdebi显示为already in
2021-09-28 11:02:50
217
原创 新版VSCode 1.60.0版 解决“无法将XXXX项识别为 cmdlet、函数、脚本文件或可运行程序的名称”的问题
前几天VSCode自动更新了,然后插件Task Explorer里面的任务就无法执行了。看了一下,发现了原因:以前我在user配置里有:{ "terminal.integrated.shell.windows": "C:\\WINDOWS\\System32\\cmd.exe" //这条已经失效了}然后报错则是提示:The terminal process “C:\windows\System32\WindowsPowerShell\v1.0\powershell.exe -C
2021-09-06 17:55:05
10111
原创 计算机网络 理解拥塞控制
TCP的流量控制服务完成了对发送方发送速率的调节——当TCP通信的接收方的接收速率无法匹配发送速率时,发送方会降低发送速率。但流量控制没有考虑到整个网络中的情况——即使路由器能够存储一些数据,但若源源不断的数据到达速率高于路由器的发出速率,任何容量的路由器都会溢出。路由器因无法处理高速率到达的流量而被迫丢弃数据的现象被称为——拥塞。从流量控制服务可知,针对于丢包情况,TCP采取的首要机制是重传,包括超时重传和快速重传。但如果网络已经处于了拥塞状态,你再进行重传,会导致同一时间段内网络传输路径上需要
2021-08-25 22:26:24
1386
原创 计算机网络 理解流量控制与SACK机制
如果应用进程读取数据时相对缓慢,而发送方发送得太多、太快,发送的数据就会很容易地使得接收缓存溢出。所以TCP为它的应用进程提供了流量控制服务(flow-control service)以消除接收缓存溢出的可能性。流量控制实际上是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读取速率相匹配。
2021-08-18 22:09:44
1301
原创 为什么TCP三次握手的时候ACK=Seq+1
简而言之,接收方反馈的ACK之所以加1,是因为发送方包含了SYN标志位或FIN标志位。也就是说,只要发送方包含了 SYN标志位或FIN标志位,即使没有包含数据,接收方也得认为 发送方消耗掉了一个序号。另外,带有 SYN标志位或FIN标志位的报文段(在三次握手和四次挥手中),也是不允许携带数据的。
2021-08-14 19:42:50
2504
原创 Adobe Audition提示 音频输入的采样率与输出设备不匹配——问题解决
在Audition中新建音轨时,也确实是按照24位,44100Hz的选项来新建的,但在record的时候还是出现错误提示。在 编辑==>首选项==>音频硬件 中进行设置:将输入和输出都改为 声卡的输入输出。
2021-06-14 17:30:20
13439
1
原创 Python3 读取、新建、追加写入Excel文件
直接安装Anaconda,它会自带xlrd模块,和openpyxl模块。我是用的是openpyxl模块,这个模块写入excel的好处是它不会改变原有excel的样式(最开始我用的是xlwt和xlutils,但是会改变原有样式)。
2021-04-15 21:03:09
2737
2
原创 计算机网络 可靠数据传输原理——从rdt协议到GBN到SR
TCP处于运输层中,虽然下层协议——网络层协议是不可靠的,但TCP必须为它的上层提供一种可靠数据传输协议(reliable data transfer protocol)。这种协议提供的服务为:数据可以通过一条可靠的信道进行传输。借助于可靠信道,传输数据比特就不会受到损坏或丢失,而且所有数据都是按照其发送顺序交付给接受方。
2021-02-28 16:32:44
4295
4
原创 VSCode复制代码时去掉样式/语法高亮/代码高亮/黑色背景
将图中位置去掉勾即可。在settings.json文件是这样的,没有这项的话默认是true的:{ something , "editor.copyWithSyntaxHighlighting": false}
2021-02-04 10:39:12
12357
2
原创 你真的会写二分查找吗——变种二分查找
其实我已经写过一篇关于变种二分查找的博客了,但最近刷题时发现之前对变种二分查找的理解不够深刻,而且相比之前博客的实现,本文有了另一种不同的实现,虽然只是具体细节不一样。
2020-11-07 23:11:39
342
1
原创 LeetCode-SQL练习题总结(MySQL实现)
对LeetCode上的SQL练习题的免费部分进行了部分讲解,考虑大部分公司并没有升级到Mysql8,所以本文也没有使用窗口函数的解法(以后可以考虑补充,毕竟用了窗口函数解法就没有了通用性)。
2020-09-10 23:51:01
1007
原创 JUC线程池 ScheduledThreadPoolExecutor源码解析 JDK8
ThreadPoolExecutor的功能已经很强大了,但却没有延时任务的功能。对于ScheduledThreadPoolExecutor,它的父类ThreadPoolExecutor所做的提交任务都是延时时间为0的延时任务。同时,它也提供了执行周期任务的功能。
2020-09-03 20:21:42
610
1
原创 JUC线程池 ThreadPoolExecutor源码解析 JDK8
ThreadPoolExecutor提供了管理线程的功能,它的最大好处在于能够复用线程,而不必在想要异步执行时用原始的new Thread().start()起线程。在构造ThreadPoolExecutor时通过给定不同的参数,可以得到不同效果的线程池。这样,使用者可以不用关心线程的管理,而专心于业务的编写。
2020-08-31 23:19:08
1164
原创 JUC框架 CompletableFuture源码解析 JDK8
我们知道FutureTask实现了task异步执行,但对于执行结果的获取,如果异步执行还在进行中,那么线程只能get阻塞等待,或者轮询isDone,这两种方式都和我们开始实现异步的初衷相违背。所以就诞生了这个CompletableFuture,它的最大不同之处在于,通过提供回调函数的概念,把处理执行结果的过程也放到异步线程里去做。
2020-08-24 23:41:27
2212
1
原创 JUC框架 FutureTask源码解析 JDK8
FutureTask的使用方法已经在上一篇进行了讲解,其实它和SynchronousQueue很像,执行task的线程是生产者,获取执行结果的线程是消费者,消费者阻塞的原因不是生产者还没来,是因为生产者还没有生产出来执行结果。只不过,这里只有一个生产者(FutureTask对象),却可以对应到多个消费者(对同一个FutureTask对象调用get的不同线程)。
2020-08-17 00:05:00
864
原创 JUC框架 从Runnable到Callable到FutureTask 使用浅析
本文旨在简单讲解Runnable、Callable、FutureTask这几个线程执行相关的接口和类。为后面FutureTask源码讲解作铺垫。
2020-08-15 19:49:39
568
原创 JUC集合类 SynchronousQueue源码解析 JDK8
SynchronousQueue其实就是LinkedTransferQueue的升级版,相同的是它们都作为生产者和消费者交互的通道,可以直接让生产者和消费者打交道。不同的是,SynchronousQueue做的更彻底,不去支持无关的共有操作(比如size()),只提供必要的入队出队方法。并且,SynchronousQueue提供了两种逻辑结构,栈和队列。理解LinkedTransferQueue是搞懂SynchronousQueue的前提。
2020-08-15 11:42:42
2000
原创 JUC集合类 LinkedTransferQueue源码解析 JDK8
LinkedTransferQueue是一种特殊的无界阻塞队列,它提供一种Transfer的功能,用以保证生产者把数据传输给消费者。其他的普通队列,生产者是不需要关心消费者是否存在的,但现在的LinkedTransferQueue却需要保证生产者把数据确实传输给了消费者,才算是一次成功的入队操作,否则算作入队失败。
2020-08-09 22:38:05
715
原创 JUC集合类 DelayQueue源码解析 JDK8
DelayQueue是一个无界阻塞队列,它和PriorityBlockingQueue一样是一个优先队列,但区别在于队列元素只能放置Delayed对象,而且只有元素到期后才能将其出队。内部是一个最小堆,堆顶永远是最先“到期”的那个元素。如果堆顶元素没有到期,即使线程发现队列中有元素,也不能将其出队。DelayQueue需要依赖于元素对Delayed接口正确实现,即保证到期时间短的Delayed元素.compareTo(到期时间长的Delayed元素) < 0,这样可以让到期时间短的Delayed元素
2020-08-07 22:59:40
517
1
原创 JDK8 PriorityBlockingQueue(Collection<? extends E> c)构造器 源码解析
PriorityBlockingQueue的这个(Collection<? extends E> c)重载版本构造器的源码有几个地方有点难懂,但本文讲述内容不是PriorityBlockingQueue的重点理解内容,所以本文单独讲解。
2020-08-05 22:41:53
387
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人