自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 单调栈算法

前言前几天群里吹水,有同学去面头条,在群里分享面试题,其实就有一道单调栈,碰巧前几天我也刷了同样一道,但是当时没想到写O(N)的解法,吹完水就去了解了一下这个所谓的单调栈。单调栈针对求下个更大的数之类题目 的一个很巧妙地解法,时间复杂度可以达到O(N)Input: [73, 74, 75, 71, 69, 72, 76, 73]Output: [1, 1, 4, 2, 1, 1, 0, ...

2021-01-14 16:35:04 270

原创 2019年终总结&&研究生中期总结

前言去年就想写年终总结,但是去年想了下可写的东西实在不是很多,也就作罢。对我来说,读研是一个新的开始,与浑浑噩噩的本科挥别,不管是时间阶段还是心理上,我都要翻开一个新的篇章。至此,我读研近乎一半了,这个年终总结,也可以认为是我的一个研究生中期总结。我的Java学习研究生大多数时间在学习java,就从java说起吧。本科学的万金油专业,自己的面向就业学习的意识也不强,到了找工作发现自己甚至都...

2021-01-14 16:29:32 720 2

原创 2020年终总结

2021已经走过了半个月,我颓废了半个月。秋招前,研一研二我都秉着一口气,我以为我可以一直屏下去的,也许是实习期被公司和学校还有一些感情的事情搞得心力憔悴,也许是我真的太久没有休息了。反正,没错,我颓了一个季度。好吧,其实中间还水了一个小论文。也罢,休息好,我又回来了。这个总结也可以算是我的转行总结,给三年前的自己一个交代。2018年初,彼时的我经历了大学四年的迷茫。大学学的信息工程,软硬件都学,最终跟大部分人一样,学了一通还是啥都不会。其实作为信息学科学生,我是有意识到互联网浪潮的兴起的,但是说真

2021-01-14 16:28:45 172 1

原创 讲讲redis底层数据结构吧

redis有五种对象类型,分别是字符串、列表、哈希、集合、有序集合,redis的键值对是两个对象,键一般是字符串,值就这五种中选了。字符串字符串的编码可以了解下SDS,全称Simple Dynamic String和C语言中的字面量String相比,SDS优势主要以下几点提供了len属性,O(1)获取长度动态扩展,C语言中的String占多少内存是固定的,进行拼接之类操作如果不提...

2020-02-17 19:32:02 196

原创 悟已往之可谏—undo log

undo log记录我们对记录的一些改动。所以读记录是不会写入这个日志的,只有增删改才可以。分为两种类型,insert操作是其一,非insert操作是其二。因为insert的log在事务提交后就可以删除了,而非insert 类型的undo log还要为MVCC而服务。insert 对应undo loginsert操作对应的undo log中记录主键就可以了。记录中有一个roll_pointer...

2020-02-13 20:26:10 201

原创 一文带你彻底搞懂ThreadLocal

前言共享变量一直是并发中的老大难问题,每个线程都对它有操作权,所以线程之间的同步很关键,锁也就应运而生。这里换一个思路,是否可以把共享变量私有化?即每个线程都拥有一份共享变量的本地副本,每个线程对应一个副本,同时对共享变量的操作也改为对属于自己的副本的操作,这样每个线程处理自己的本地变量,形成数据隔离。事实上这就是ThreadLocal了。就线程同步而言,锁可以认为是时间换空间,ThreadL...

2019-12-26 20:54:53 355

原创 Zookeeper和Redis中的选举工作

前言最近在准备复习了,想着把以前的知识串一串,零零散散的总是很容易忘,知识还是要成体系的,这也是互联网工程师的必备素养吧,要不每天都有新知识,等到35还怎么和年轻人拼,只有沉淀出自己的东西,才能不被淘汰。现在到处都是分布式、高并发,我们用的很多东西像数据库之类的到了生产环境都会是集群部署,每台机器都是一个节点,很多场景又会分为主从节点,比如主写从读啊之类的,当然,说到这里少不了节点挂了的情况,...

2019-12-15 17:48:39 1011

原创 一文彻底搞懂TCP

首先明确TCP的几个特点有始有终有序性可靠性拥塞控制流量控制有始有终即TCP的建立连接和关闭连接,也就是所谓的三次握手和四次挥手三次握手建立连接刚开始客户端和服务端都是关闭状态当要建立连接时,服务端先开启监听状态客户端发送SYN至服务端,同时声明自己的消息序号,进入SYN-SENT状态服务端发送ACK表明自己收到客户端消息,同时发送SYN并声明自己的消息序号,此时服...

2019-11-25 18:03:33 549

原创 简要剖析java中的深拷贝与浅拷贝

前言浅拷贝和深拷贝都是对一个已有对象的拷贝,拷贝的结果是一个新的对象,那么他们的区别是什么呢?我们知道对象都是有属性的,属性又分为基本数据类型比如int,和实例引用类型这两种。针对基本数据类型没什么好说的,直接复制过去就好。关键之处就在于引用类型,浅拷贝生成的对象的引用类型的属性和原对象是同一个,而深拷贝则反之。浅拷贝我们都知道java中的对象都会有clone方法,这是一个用来实现拷贝的n...

2019-11-16 19:06:49 83

原创 揭秘Spring(六)之复盘分析Bean的加载

前言前边我们吭哧吭哧的说了一堆bean加载过程中可能的扩展方式,在本节中,我们就从源码的角度详细分析下bean的加载过程。需要提前说明的是,为了便于阅读以及限于篇幅,我展示的代码可能会对源码做出了部分删除省略,当然,相应处都会标记,如果感兴趣的话,可以自己对比源码阅读。getBean()Account account=(Account) beanFactory.getBean("accou...

2019-11-13 21:16:56 157

原创 揭秘Spring(四)之InitializingBean与DisposableBean

前言前边我们说了BeanPostProcessor,该接口中有两个方法,InitializingBean发挥作用的时机就在这两个方法之间。从语义也很好看出来,postProcessBeforeInitialization -> initializingBean -> postProcessAfterInitializationInitializingBeanpublic inte...

2019-11-10 15:26:03 172

原创 揭秘Spring(三)之BeanPostProcessor

前言其实有想过完整的写baan的生命周期,但是考虑到篇幅,我还是拆分成小点,最后再串起来。前边我们基本说完了容器的启动,接着该看看Bean的实例化了。Bean的实例化其实这一部分我在前一节已经说过了,对于BeanFactory来说,对象默认延迟初始化,即只有getBean()才会初始化; 但是对于ApplicationContext,该容器启动会初始化所有bean的定义,即容器启动就调用...

2019-11-08 14:43:38 156

原创 揭秘Spring(二)之BeanFactoryProcessor

前言在上一节中,我们说到了BeanFactory是较为轻量的容器,这个容器启动时会通过BeanDefinitionReader来加载配置文件获得对应BeanDefinition,然后将BeanDefinition注册到BeanDefinitionRegistry。这些是容器启动所做的工作,下一阶段就该实例化了。如果当前使用的容器是BeanFactory,那么在getBean()时才会实例化;...

2019-11-07 16:38:14 611

原创 揭秘Spring(一)之BeanFactory和FactoryBean

BeanFactoryBeanFactory和ApplicationContext是Spring中的两种容器。BeanFactory默认采用延迟初始化策略,所以相对来说,容器启动较快,所需资源不多。ApplicationContext间接继承自BeanFactory,增加国际化等高级功能,其管理的对象在容器启动后默认全部初始化完成,所以启动所需要资源较多,所需时间长public i...

2019-11-06 22:09:19 146

原创 MySql事务并发处理之MVCC

概述MVCC全称是Multi-Version Concurrent Control,即多版本并发控制,数据库中同一时间不同事务的并发执行依靠的就是这个东西。在说MVCC之前,先来回顾一下数据库中事务并发执行的一些问题。事务并发带来的问题脏写事务1修改了事务2中修改完成但还没提交的数据,接着事务2提交,接着事务1回滚,导致事务2中的修改被覆盖回滚脏读事务1读取了事务2中修改完成但还没提交...

2019-11-04 17:40:44 218

原创 深扒AQS(四)之ReentrantReadWriteLock

前言上一节我们说了ReentrantLock,这个锁可以很好的保证线程安全,接下来我们考虑对这个锁的优化,实际上很多业务场景都是读多写少的场景,ReentrantLock是个独占锁,所以不能很好的应对并发的读请求,ReentrantReadWriteLock应运而生,可以分离读锁和写锁,其中读锁是共享锁,写锁是独占锁,提高并发性能。基本介绍属性public class ReentrantR...

2019-11-03 18:00:21 167

原创 深扒AQS(三)之ReentrantLock

前言前边两节我们分别讲了AQS的阻塞队列和条件队列,算是对AQS有了一个基本的了解,这一节中,来看一哈AQS在JUC中的一些锁上的应用ReentrantLock可重入锁,顾名思义,获得这个锁的线程还可以再次获得,与此对应的,放弃这个锁的次数必须跟获得次数对应,不然就不算彻底放弃。Synchronized也是可重入锁。public class ReentrantLock implements...

2019-11-02 20:34:46 135

原创 深扒AQS(二)之condition

概述我们在第一节中AQS的属性那里说过AQS类中还有一个ConditionObject的内部类public class ConditionObject implements Condition, java.io.Serializable { // 条件队列首节点 private transient Node firstWaiter; // 条件...

2019-11-01 20:11:30 2777 4

原创 深扒AQS(一)之独占共享解析

AQS可以说是并发中最关键的一环了,包括我们前边用过了无数次的ReentrantLock以及各种锁就是AQS的典型应用。AQS全名为AbstractQueuedSynchronizer,抽象同步队列AQS属性private transient volatile Node head;private transient volatile Node tail; private vol...

2019-11-01 20:09:27 591

原创 小探CopyOnWriteArrayList

前边jdk源码系列中提到了hashmap和ArrayList都不是线程安全的容器,那么接下来,在本文中就来看一下jdk是怎么实现支持并发线程安全的容器吧并发List之CopyOnWriteArrayList顾名思义,写时复制的一个list,既然说是list,底层不用说肯定是数组了。来看下吧属性public class CopyOnWriteArrayList<E> im...

2019-10-29 14:27:44 108

原创 深度解析并发阻塞队列

上篇博客中我们说到了线程池中的workQueue,任务队列private final BlockingQueue<Runnable> workQueue;可以看到是BlockingQueue类型,BlockingQueue是个接口,我们实际上用到的并发队列是BlockingQueue的各种实现。我们就挨个儿来一探究竟吧BlockingQueuepublic interface...

2019-10-28 18:01:28 202

原创 深度剖析线程池

之前在网上看一些面试题,每每看到线程池相关的都有种心虚的感觉,总感觉似懂非懂,禁不起敲打,也罢,好好写篇文章学习下线程池就。类的结构ExecutorService是我们常用的接口,继承了Ececutor,在Executor的基础上添加了很多功能。ThreadPoolExecutor就是我们线程池的核心类了,可以用它的构造方法实现多种不同的线程池。还有一种线程池ScheduledThre...

2019-10-27 21:58:00 145

原创 深入理解volatile

前言上篇文章说过,在双重检查的单例模式中,如果不用volatile,可能会导致重排序,进而产生一个空的单例。而volatile可以有效避免重排序,接着来探究下这一实现的原理吧happens before可以认为hasppens before是JMM为java程序员设定的程序执行前后顺序的规则,注意,只是程序员可以这么去看程序的执行顺序,即语义上的happens before,实际上底层执行可...

2019-10-26 17:11:07 178

原创 单例模式线程安全问题引发的思考

前言说到面试,肯定少不了并发编程、多线程这些啦,这部分相对来说有一定的难度,而且学了就忘,让人头大,因此我打算好好捋一捋这部分,还是那句话,99%的东西是不需要智力的,惟手熟尔,多看几遍写几遍就好啦。概述首先需要理解多线程编程的一些由来。其实无非就是改善单线程的速度,一定能改善吗?也不尽然,在单核机器上,如果当前线程一直阻塞在IO,那么此时多线程肯定是有必要的,不然一直等着他IO也不是个事儿...

2019-10-25 16:24:20 238

原创 java中断详细介绍及其对各种线程状态的影响分析

最近在复盘java并发的知识,借这篇文章总结下java的线程状态以及各状态下的中断影响。中断简介首先来看几个常用的中断Api,在此之前我们先来看一个本地方法private native boolean isInterrupted(boolean ClearInterrupted);这个本地方法是我们接下来要说的Api的底层关键实现,返回该线程中断标志位是否被标记。该方法中的参数Clear...

2019-10-24 16:30:35 242

原创 Hashtable、Hashset傻傻分不清?

其实本来说不写这两个类了,但是跟一块心病似的。还是写了吧,把这些不太熟的犄角旮瘩都打扫一遍!Hashtablepublic class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable {Dictionar...

2019-10-22 14:21:28 133

原创 LinkedHashMap为什么是有序的?

简单介绍public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{ transient LinkedHashMap.Entry<K,V> head; transient LinkedHashMap.Entry&l...

2019-10-21 16:07:03 2366

原创 hashmap源码解析面试必备干货

概述本文基于jdk1.8,关于树的部分先简要介绍,大体跳过,后续回来补坑~hahsmap底层是由哈希桶组成的,何谓哈希桶?其实就是数组,每个数组元素我们称之为桶,桶一般是由链表组成,链表长度到8时,会转化为红黑树,以此来提升效率。hashmap中计算key的hash值时候,使用了扰动函数。hashmap计算元素下标方法是hash&(n-1),n即哈希桶的容量,因为哈希桶容量有限,这就...

2019-10-20 17:04:28 125

原创 LinkedList源码分析

public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable实现了List接口,代表着可以实现精准控制,即所谓的按照index进行一系列操作。D...

2019-10-19 16:19:54 83

原创 ArrayList源码分析

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable实现了三个接口。RandomAccess即随机访问,这个接口没有实际意义,可以理解为实现了这个接口标志着该类具...

2019-10-18 15:22:34 55

原创 java是值传递还是引用传递

这个问题的存在由来已久,首先回忆下值传递和引用传递分别是什么。值传递说白了就是传递到函数的形参不会改变实参内容,值传递则会影响改变实参。java中好像有时候是值传递有时候是引用传递弄的人头晕,那么,分别来看下这两种情况吧public class User { private String name; // setter getter private vo...

2019-10-17 19:17:21 112

原创 BIO&NIO

BIO 阻塞IO首先要明确的一点是NIO中非阻塞的实现是基于Selector的,所以如果不采用Selector,只采用channel和buffer,还是存在阻塞。看一下BIO的Serverpublic class Server { public static void main(String[] args) throws IOException { ServerSoc...

2019-09-21 13:49:11 102

原创 NIO之三大组件

java1.4引入了NIO.标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作.NIO中的读操作是从channel到buffer,写操作是从buffer到channel标准IO中流总是单向的,channel则是双向的,数组总是从channel读到buffer,然后再从buffer取出。或者先写入buffer,再从buffer进入到cha...

2019-09-20 19:32:34 176

原创 Spring AOP之详解代理模式

aspect oriented programming1、动态代理 必须实现接口InvocationHandler2、动态字节码增强 为指定类生成子类,在子类中加入横切逻辑,应用程序在执行期间执行的是子类,这种方法不需要实现接口,但是若指定类是final就不行3、自定义类加载器Joinpoint 进行织入操作的执行点(可以获取该点所在的一些信息)PointCut 指定切入的位置,可以使...

2019-09-19 17:23:31 144

原创 rdt协议

rdt1.0(完全可靠信道)发送方每次发送一个分组,接受方接受一个分组,数据均是从发送方流向接收方rdt2.0 (具有比特差错信道的可靠传输)自动重传协议(ARQ):打电话:说明白了,对方就ok(ack);说的不清楚,对方就请再说一遍(nak),此时就再说一遍)差错检测 接收方反馈 重传停等协议(stop and wait):发送方在发送完一次数据后,只有受到ACK才可以接受上层的...

2019-09-18 15:27:00 3125

原创 IO中的设计模式

java的IO中主要有适配器和装饰器两种设计模式。简要说明下这两种设计模式,适配器,生活中就有这个东西嘛,现在很多手机取消了耳机孔,用一个适配器你就可以用type-C充放口听歌了。即,将一个接口适配到另一个接口。IO中有一个很常见的场景,把字符串转化为字节保存到文件中,用type-c口听歌,很像对吧,这里就用到了适配器模式。public class Adapter { public s...

2019-09-12 20:25:20 929

原创 深入理解MySql之B+索引

索引的设计思路:去遍历所有数据页,再去遍历页中的链表太费时间。所以考虑再建立数据页的目录,快速查找数据页面,每个目录项包括两部分,该页内的最小主键,页号新分配的数据页编号可能并不是连续的,也就是说我们使用的这些页在存储空间里可能并不挨着。下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值把几个目录项在物理存贮上连续存贮,比如数组,所以查找的过程就是先根据主键二分查找到页,再...

2019-09-12 15:53:05 162

原创 深入理解Mysql之InnoDb

InnoDb将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16KB。也就是在一般情况下,一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中。一个数据行中分为记录的额外信息和记录的真实数据两部分记录的额外信息 包括变长字段长度列表/NULL值列表/记录头信息真实数据就是各列的数据值把所有变长字段的真实数据占用...

2019-09-12 15:44:16 240

原创 计算机常识之编码解码字符集

编码就是将字符映射成二进制,解码是将二进制映射到字符字符集包括以下几种:ASCII字符集:共收录128个字符,所以使用1个字节来进行编码**ISO 8859-1 **字符集,共收录256个字符,是在ASCII字符集的基础上又扩充了128个西欧常用字符GB2312字符集 收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个,其他文字符号682个。同...

2019-09-12 15:16:36 229

原创 redis设计之发布与订阅

频道的订阅与退订客户端执行SUBSCRIBE/UNSUBSCRIBE 来订阅和退订频道REDIS服务器将所有频道的订阅关系保存在服务器状态的pubsub_channels字典里面,这个字典的键是某个频道,值是所有订阅了这个频道的客户端组成的链表订阅频道:遍历所有频道列表,若是没找到该频道,字典中添加channel键,设置值为空链表,最后将客户端加入链表末尾;若是遍历的过程中找到,直接加入末...

2019-09-09 16:17:30 77

空空如也

空空如也

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

TA关注的人

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