自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

船长

个人学习总结笔记

  • 博客(71)
  • 收藏
  • 关注

原创 开发日记:使用Lombok插件@Bulider注解和mybaits查询结果注入的冲突

Lombok插件让开发变得更便捷,也带来了很多潜在的问题,如果不去了解Lombok插件的工作过程,就可能会出现很多难以预料的问题。在xml中创建一个mybatis的简单查询:<select id="queryElectronSmsSendInfoListByPage" resultType="com.meituan.it.finerp.contract.electron.entity.E...

2020-01-18 22:35:34 587

原创 Clean Code随笔

文章目录命名将代码规范和java面向对象的特性结合起来函数短小,更短小每个函数一个抽象层级自顶向下读代码:向下规则函数参数函数名称应该体现出函数的所有功能,否则会因为时序性耦合导致一些副作用使用异常替代返回错误码1. 错误处理代码能从主路径代码中分离出来2. 新异常可以从异常类派生,但返回码需要管理格式概念间垂直方向上的区隔对象和数据结构错误处理使用异常而非返回码命名将代码规范和java面向对...

2019-12-11 12:10:11 300

转载 HTTP协议学习笔记(二)

目录HTTP有哪些方法?这些方法的具体作用是什么?GET和POST有什么区别?PUT和POST都是给服务器发送新增资源,有什么区别?PUT和PATCH都是给服务器发送修改资源,有什么区别?http的请求报文是什么样的?http的响应报文是什么样的?聊一聊HTTP的部首有哪些?聊一聊HTTP的状态码有哪些?同样是重定向307,303,302的区别?H...

2019-09-02 10:13:41 329

原创 操作系统学习笔记(一)

文章目录进程和线程进程的常见状态以及状态转换线程的状态和转换进程同步进程的通信方式有哪些?多线程互斥和同步临界资源Semaphore(信号量) Vs Mutex(互斥锁)进程和线程的关系进程与线程的区别进程上下文切换和线程上下文切换进程调度调度种类非抢占式调度与抢占式调度调度策略的设计调度算法:死锁产生死锁的必要条件处理死锁问题内存池、进程池、线程池程序从开始运行到结束的四个过程动态链接库与静态链...

2019-09-01 17:29:17 249

原创 RabbitMQ总结(一)

rabbitmq常见问题

2019-08-28 17:37:48 350

原创 Linux用户态与内核态学习笔记

用户空间与内核空间:现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将...

2019-08-28 17:37:05 139

原创 Java内存模型(JMM)

缓存一致性在多处理器的系统中,每个处理器都有自己的高速缓存,而他们又共享同一主内存,如何保证缓存内部数据的一致,不让系统数据混乱。JMM在Java语言中,多个线程之间采用的是共享内存模型来实现多线程之间的信息交换和数据同步的,Java虚拟机规范试图定义一种Java内存模型来屏蔽叼各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。Java内存模型...

2019-08-20 14:55:29 153

原创 Netty学习笔记内存管理篇:内存分配ByteBufAllocator

此接口来进行实际的内存分配,默认使用的是ByteBufAllocator.DEFAULT,初始化时会根据配置和平台进行赋值。io.netty.allocator.type可以设置为unpooled和pooled指定是否需要缓冲池,如果不设置则会根据平台判断。逻辑如下:static { String allocType = SystemPropertyUtil.get( ...

2019-08-12 17:22:53 2618

原创 Netty学习笔记内存管理篇:Netty内存池管理

目录Netty内存池设计思路内存池结构PoolArenaPoolChunkPoolChunkListPoolPagePoolSubpage本地线程存储对象池内存释放内存泄露检测Handler中的内存处理机制Netty内存池创建堆外内存的速度比堆内存慢了10到20倍,为了解决这个问题Netty就做了内存池,Netty的内存池是不依赖于JVM...

2019-08-12 16:45:17 3047

原创 Netty学习笔记内存管理篇:ByteBuf

ByteBuf主要功能类继承关系图目录内部格式ByteBuf的四种声明方式ByteBuf与Java NIO ByteBuffer类似,由于ByteBuffer存在一定的缺陷,具体缺陷如下:1)ByteBuffer长度固定,一旦分配,则容量不能动态扩展和收缩2)ByteBuffer只有一个标识位置的指针,读写的时候需要手动的调用flip()方法来进行从写到读模式的切换,否则...

2019-08-12 16:01:21 398

原创 Netty学习笔记通信调度篇:NioEventLoop源码解读

目录初始化过程Netty对Selecter的优化注册channel过程NioEventLoop的任务处理机制run 方法实现select处理就绪事件runAllTasks处理非I/O任务。NioEventLoop 继承于 SingleThreadEventLoop, 而 SingleThreadEventLoop 又继承于 SingleThreadEventEx...

2019-08-12 16:01:11 381

原创 Netty学习笔记内存管理篇:AbstractByteBuf分析

目录writeBytes(byte[] src)readBytes(byte[] dst)discardReadBytes()AbstractByteBuf是ByteBuf的第一个子类,这个类定义了一些公共属性(如下),这些公共属性包括:读索引、写索引、mark以及最大容量等。 public abstract class AbstractByteBuf extends ...

2019-08-12 16:01:00 576

原创 Netty学习笔记内存管理篇:直接内存和堆内存

目录直接内存和堆内存堆内存直接内存(堆外内存)零拷贝NIO原生直接内存直接内存的GCNetty的直接内存在介绍Netty的内存管理前,先简单了解一下直接内存和堆内存直接内存和堆内存jvm中使用的内存可分为两种,一个是堆内存,一个是直接内存。堆内存(HeapByteBuf)字节缓冲区:特点是内存的分配和回收速度快,可以被JVM自动回收;缺点就是如果进行So...

2019-08-12 16:00:44 4918 2

原创 Netty学习笔记通信调度篇:上层接口源码解析

我们按继承关系解析一下出现在这张图中的类目录EventExecutorGroupIterableEventExecutorAbstractEventExecutorGroupAbstractEventExecutorEventExecutorGroup先看一下接口内部定义的方法public interface EventExecutorGroup e...

2019-08-12 16:00:20 334

原创 Netty学习笔记通信调度篇:NioEventLoopGroup源码分析

目录NioEventLoopGroup类层次结构MultithreadEventExecutorGroupEventExecutorChooserFastThreadLocalRunnable在创建主从Reactor多线程模型的Netty服务端时,服务端的代码如下: EventLoopGroup bossGroup = new NioEventLoopGro...

2019-08-12 16:00:02 406

原创 Netty学习笔记通信调度篇:Reactor线程模型

目录Reactor模型单线程模型多线程模型主从多线程模型示例代码Reactor模型Netty中的Reactor模型主要由多路复用器(Acceptor)、事件分发器(Dispatcher)、事件处理器(Handler)组成,可以分为三种。单线程模型所有I/O操作都由一个线程完成,即多路复用、事件分发和处理都是在一个Reactor线程上完成的。对于一些小容量...

2019-08-12 15:59:49 289

原创 Executor多线程框架学习笔记(四):ThreadPoolExecutor源码分析

目录创建新线程:addWorker线程的主循环线程结束:processWorkerExitThreadPoolExecutor的状态变迁ThreadPoolExecutor实例创建之后,在没有调用execute提交任务之前,ThreadPool中是没有线程的,线程的创建是依赖exeute来驱动的。可以说,exeute是ThreadPoolExecutor运行的触发器,所有我选择...

2019-08-12 10:42:19 163

原创 Executor多线程框架学习笔记(六):ScheduledThreadPoolExecutor源码分析

ScheduledThreadPoolExecutor该线程池继承于ThreadPoolExecutor并且实现了ScheduledExecutorService,用于计划任务执行,如定时周期任务,延迟执行任务等存有计划的任务。此类的几个特性不管是不是计划任务都会当做计划任务封装为ScheduledFutureTask对象,如果不是计划任务延迟则为0. 核心线程数和最大线程数的...

2019-08-12 10:22:41 168

原创 Executor多线程框架学习笔记(五):FutureTask

FutureTaskScheduledThreadPoolExecutor里面用到了FutureTask,提前将对其进行讲述public class FutureTask<V> implements RunnableFuture<V> { //当前任务的运行状态 volatile修饰了他的可见性 //因为任务在运行中是使用子线程运行的在其他线程中可...

2019-08-12 10:22:03 309

原创 Executor多线程框架学习笔记(一):Executor

目录为什么要有线程池线程池的好处ExecutorExecutorServiceCallable和Runnable任务Executor多线程框架学习笔记(一):ExecutorExecutor多线程框架学习笔记(二):线程池初始化参数和ThreadPoolExecutorExecutor多线程框架学习笔记(三):ScheduleExecutorService...

2019-08-11 13:01:28 188

原创 Executor多线程框架学习笔记(三):ExecutorService

目录ExecutorServiceScheduleExecutorServiceScheduledFutureAbstractExecutorServiceExecutorServiceExecutorService是一个服务可以当做管理工具,他管理了执行器的创建和停止,既然是执行器服务那么就代表着他是可以管理多个执行器的否则也就没有意义,但是也是一个接口对于他的定义如下...

2019-08-11 12:59:45 171

转载 零拷贝技术

目录DMA(直接存储器访问)网络数据传输的全过程zero-copy:mmap()zero-copy:sendfile()zero-copy:splice()zero-copy: tee()写时复制技术(copy-on-write,COW)DMA(直接存储器访问)DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不...

2019-08-10 10:54:32 139

原创 剑指offer:字符串的全排列

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。解题思路:经典的动态规划问题,固定第一个字符,然后依次将后面的字符串与前面的交换,那么排列的个数就是除了第一个字符以外,其他字符的排列个数+1。也就是固定一个字符串之后,之后再将问题变小,只需求出后面子串的排列个数就可以得...

2019-08-08 19:00:44 268

转载 MySQL学习笔记索引篇:B树和B+树

目录B 树文件查找的具体过程(涉及磁盘IO操作)B树的高度B+树B+树更适合用于文件索引和数据库索引B+树的分裂B*-tree总结B 树B 树是为了磁盘或其它存储设备而设计的一种多叉(下面你会看到,相对于二叉,B树每个内结点有多个分支,即多叉)平衡查找树。与之前介绍的红黑树很相似,但在降低磁盘I/0操作方面要更好一些。B树与红黑树最大的不同在于,B树的结...

2019-08-08 16:12:06 3635

原创 MySQL学习笔记事务篇:MySQL中的锁

目录读写锁锁粒度:表锁和行锁悲观锁优点与不足乐观锁优点与不足数据库事务的ACID中的隔离性是由锁来实现的,所以需要了解一下数据库中有哪些锁。读写锁在处理并发情况时,通过共享锁和排他锁来实现。写锁会阻塞其他的写锁和读锁。锁粒度:表锁和行锁为了提高资源共享的并发性,尽量锁定需要修改的部分数据。在给定的资源上,锁定的数据量越少,则系统的并发程度越高,只要相互之...

2019-08-08 15:21:21 130

原创 MySQL学习笔记事务篇:分布式事务之2PC和3PC

目录背景二阶段提交协议阶段一阶段二执行事务提交中断事务扩展讨论三阶段提交协议阶段一阶段二执行事务预提交中断事务阶段三执行提交中断事务扩展讨论总结背景本地事务通过ACID特性能够很好地解决原子性、一致性以及隔离性问题,然而当今大部分的软件架构对系统都有扩展的诉求,系统扩展引发了资源的分布,分布的资源可以很好地支持系统的...

2019-08-08 15:19:15 1277

原创 MySQL学习笔记事务篇:undo日志和MVCC

目录undo logundo log的存储方式delete/update操作的内部机制:purge 机制insert undo logupdate undo logMVCCMVCC的实现原理结构MVCC工作过程undo logundo用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录。undo log和redo log记...

2019-08-08 15:19:03 4971 2

原创 MySQL学习笔记索引篇:索引基本原理

目录硬盘读写过程数据库加载数据的过程块与页索引基本原理索引的优点索引的种类聚簇索引非聚簇索引硬盘读写过程确定磁盘地址(柱面号,磁头号,扇区号),内存地址(源/目):当需要从磁盘读取数据时,系统会将数据逻辑地址传给磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址,即确定要读的数据在哪个磁道,哪个扇区。为了读取这个扇区的数据,需要将...

2019-08-08 15:18:11 216 1

原创 MySQL学习笔记事务篇:redo日志

目录预写式日志bin logbinlog和事务日志的先后顺序及group commitredo log不适用零拷贝技术的原因日志块(log block)redo log的格式日志刷盘的规则数据页刷盘的规则及checkpointLSN详细分析innodb的恢复行为和redo log有关的几个变量redo log和二进制日志的区别预写式日志i...

2019-08-07 23:59:54 774

原创 剑指offer:数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路:如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。在遍历数组时保存两个值:一是数组中一个数字,一是次数。遍历下一个数字时,若它与之前保存的数字相同...

2019-08-07 23:30:03 101

原创 剑指offer:将二叉搜索树转变成双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:手动写一颗二叉搜索树,发现中序遍历的结果是有序的,那么将中序遍历的结果保存起来,然后遍历结果集合,更改树节点的指向即可。import java.util.LinkedList;public class Convert { public static voi...

2019-08-06 20:47:07 192

原创 剑指offer:二叉树中和为某一值的所有路径

题目:输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路:经典的动态规划问题,用递归的思路解决。判断当前节点是否是叶子节点,如果是叶子节点,对比target和叶子节点的value是否相等,相等则保存起来;否则用target减去当前节点的v...

2019-08-06 19:59:21 104

原创 剑指offer:二叉搜索树的后序遍历序列

剑指offer:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。public class VerifySquenceOfBST { //后序遍历:遍历得到的序列的最后一个节点是根节点 //二叉搜索树:以根节点为界,左子树的值全部小于根节点, // 右子树的值全部大于根节...

2019-08-05 18:41:38 197

原创 Java异常学习笔记

目录异常族谱ErrorExceptioncheckedunchecked例子:NoClassDefFoundError和ClassNotFoundExceptionJava 的异常处理机制try catch finally异常处理的两个基本原则Throw early和catch late自定义异常异常族谱Exception 和 E...

2019-08-05 17:27:06 192

原创 TCP优化学习笔记(二):参数调优

目录TCP的三次握手状态解释TCP四次挥手状态解释参数调优TCP连接优化time-wait调优:减少time-wait参数说明:长连接Nginx TCP配置优化tcp_nodelaytcp_nopushsendfileTCP的三次握手状态解释CLOSED: 表示初始状态。 LISTEN:表示服务器端的某个SOCKE...

2019-08-04 18:02:31 661

原创 TCP优化学习笔记(一)

TCP协议存在的问题TCP三次握手增加了整整一次的往返时间; TCP慢启动被应用到每一次的新连接; TCP流量及拥塞控制会影响所有连接的吞吐量。 TCP的吞吐量由当前拥塞窗口大小确定。现代高速网络中的TCP连接的数据传输速度受到接收端和发送端的往返时间的限制。此外,延迟依旧受限于光速,而且已经限定在其最大值的一个很小的常数因子之内。所以,大多数情况下,TCP的瓶颈都是延迟,而非带宽。...

2019-08-04 17:28:34 186

原创 JVM 发生 OOM 的 8 种原因、及解决办法

目录堆内存不足原因解决方法永久代/元空间溢出原因解决方法GC overhead limit exceeded原因解决方法方法栈溢出原因解决方法非常规溢出分配超大数组swap区溢出本地方法溢出撸Java的同学,多多少少都会碰到内存溢出(OOM)的场景,但是造成OOM原因却不止一个。堆内存不足这种场景最为常见,报错信息:...

2019-08-04 16:52:38 953

原创 剑指offer:栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)import java.util.Stack;public class IsPop...

2019-08-03 23:21:33 67

原创 LeetCode:96 不同的二叉搜索树

给定一个整数n,求以1 ...n为节点组成的二叉搜索树有多少种?n = 3时,有5种 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ ...

2019-08-03 22:52:22 139

原创 自旋锁、排队自旋锁、MCS锁、CLH锁

目录自旋锁TICKET LOCKMCS锁CLH锁CLH锁 与 MCS锁 的比较惊群效应自旋锁自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态。自旋锁适用于锁保护的临界区很小的情况,临界区很小的话,锁占用的时间就很短。简单实现import java.util.concurrent.a...

2019-07-18 15:06:44 361

空空如也

空空如也

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

TA关注的人

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