- 博客(107)
- 资源 (1)
- 收藏
- 关注
原创 Netty4.1源码分析——服务端发送数据过程
Netty在写数据时,将写入步骤分为两个步骤,write和flush,并且write和flush中间还有个发送缓冲区ChannelOutboundBuffer。write将数据组装在ChannelOutboundBuffer内,而flush则将ChannelOutboundBuffer的数据真正的发送出去。
2021-10-26 20:19:24
731
原创 Netty4.1源码分析—— 服务端构建连接和接收数据
客户端和服务端构建完连接后,下一步的目的是开始接收/发送数据了,所以服务端构建连接其实也是在为下一步做准备——为接收数据做准备,也就是创建SocketChannel并将其注册OP_READ事件,而接收数据则实质就是处理OP_READ事件了。
2021-10-06 22:18:52
608
原创 Netty4.1源码分析—— 服务端启动过程
Netty的Server启动过程简单来说是加载配置以及为即将到来的连接做接收的准备,也就是为客户端连接服务端这一步做好准备。因为Netty的架构是Reactor模式的实现,所以这一步其实是让ServerSockerChannel注册上OP_ACCEPT事件,即接受连接事件。
2021-09-01 23:58:40
435
原创 数据库分析——Mysql索引详述
索引这词我们并不陌生,在书中我们经常性看的目录也是索引,而索引的目的就是加快查询速度,而这篇文章主要讲的是面试中经常被问到的Mysql索引。
2019-09-10 17:36:45
199
原创 基础算法与数据结构——跳表
跳表 是一种随机(跳跃点随机)且有序(数据有序)数据结构,它每个节点包含着多个指针,用来指向其它节点的,跳表就是基于此来实现其功能–跳着查找,它的平均插入以及查找的性能都为O(logn),可用于代替平衡树的一种数据结构。
2019-08-27 16:24:09
447
原创 基础算法与数据结构——排序算法
网上有很多关于对排序算法的讲解了,只是别人的终究是别人的,没有经过自己的思考与探究,知识很快就会遗忘,这篇博客主要从排序算法的空间复杂度、时间复杂度,稳定性以及简答易懂的图示讲解来描述常用的排序算法。
2019-08-25 16:11:05
354
原创 项目——仿Steam商城
项目介绍这个项目是主要设计缓存的一个练手项目,目前后台还没有实现,还在开发(现在已上传后台),但是前台流程是通了的,从登陆到购买以及秒杀。目前主要模块有五个:用户模块,游戏模块,评论模块、购物车模块以及秒杀模块。你们可以接着把这个项目写下去,里面注释写了很多,相信大家也能看懂,页面是直接在steam趴下来修改了的,嘿嘿嘿。。。。后台用的H-UI界面,上述模块的可视化操作全部实现了。项目架构图...
2019-08-01 10:52:51
5107
10
原创 Java注解以及用注解实现简单的小型Spring框架
注解在Java中是无实际意义的,并不能影响程序的运行结果以及逻辑。但是注解在Java中起着标签的作用,为代码运行提供一些特殊的信息,就像为某件事物加标签一样,从标签我们能得知程序的某些信息。以及带大家用注解简单的实现一个简单的Spring框架
2019-07-27 09:37:30
219
原创 对I/O传输的理解与思考(二)——I/O模型浅谈
本端与对端遵循某种协议建立起一种连接,在这个连接上传输二进制数据,I/O的本质就是如此,用来传输数据。I/O分为两种,一种是本机传输,即自己与自己建立起连接,也就是通过一个socket与自身建立起一种连接,用来传输文本、图片等这些数据。而另外一种则是网络I/O,本篇主要讲网络I/O的几大模型。
2019-06-27 15:26:33
893
4
原创 对I/O传输的理解与思考(一)——socket详述
Socket俗称套接字,是TCP/UDP连接的端点,用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。一般来说一个套接字由目标ip、目标端口、源ip、源端口加上协议(一般为TCP与UDP)总共五个元属性组成,只要任意一个元属性不同,那么就不是同一个socket。
2019-06-25 21:14:12
1008
原创 一起来写线程池(二)——实现拥有定时任务、周期任务线程池
ScheduledExecutor线程池在基础线程池上实现了定时任务、周期任务以及定时周期任务,其关键是在普通的任务队列上扩展实现延迟任务队列。下面来带大家一起来实现拥有定时、周期功能的线程池
2019-04-03 15:29:40
1632
3
原创 一起来写线程池(一)——实现基础线程池
线程池的原理其实很简单,就是不把执行完任务的线程关闭,而是从任务队列中拿到新的任务,接着执行。下面带着大家仿照JDK1.8线程池的思路来写一个简单的线程池
2019-04-03 13:13:38
764
原创 Redis缓存、优化
错误收集对于Redis服务应当加入异常监控系统,以便于监视发现出现的故障,常用的思路是加入日志信息,在捕获异常时监控日志的信息等级,监测超过指定次数就出发报警程序。同样也可以引入外部的检测平台监控避免阻塞1. 慢查询引起阻塞原因:慢查询需要花费时间多解决办法:利用slowlog get{n}语句可以获得最近执行时间超过10ms的命令,但是线上建议将其设置为1ms,发现毫秒级以上的操作,...
2019-04-02 22:26:27
783
原创 SpringBoot手动获取Bean类
一般在多线程的环境中,bean类的获取不能通过自动装载来获取到,spring会认为其不安全,也就是不能用@Autowired注解来获取bean类。这时候需要来在Spring中来手动获取bean类。需要继承实现ApplicationContextAware接口@Componentpublic class BeanFactoryTest implements ApplicationCont...
2019-03-01 15:38:45
11048
1
原创 项目——一个二次元博客
personalblog一个二次元的个人博客网站,基于SpringBoot+Mybatis开发,语言采用的是Java运行环境需要:Intellij IDEA、MySql、Redis、tomcat项目管理工具为Gradle写在前面此项目页面采取了Shawnzeng大佬的博客前端(做了几个地方的修改)以及开源博客tale博客的后端页面Shawnzeng大佬的博客是wordpress的一个主...
2019-02-28 12:38:53
4033
原创 Java并发容器——ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListMap类的总结
ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListMap类的总结
2018-12-18 22:28:50
703
原创 Java并发容器——阻塞队列源码分析、生产者消费者模式、CopyOnWriteArrayList、ConcurrentLinkedQueue类总结
Java在jdk1.6引入了并发容器阻塞队列,阻塞队列是一个统称,凡是实现了BlockingQueue接口的容器都可以称的上阻塞队列,它实现了生产者-消费者模式,在阻塞队列中出队列与入队列都有两种形式,阻塞的put与take方法以及定时获取的offer与poll方法
2018-12-18 17:42:30
735
原创 Java并发——线程池ThreadPoolExecutor类源码解析
线程池作为减少线程创建关闭开销的常用手段,一直被使用着,ThreadPoolExecutor类则是Java中内置的线程池中的一种
2018-12-17 11:42:22
740
原创 Java并发——FutureTask类源码解析
在线程执行的run方法是一个void方法,它是不返回任何结果与状态的,但是FutureTask可以用来在线程执行任务后,返回任务的结果。FutureTask类实现了Future接口的语义,利用Callable,即自定义任务来完成这一功能。
2018-12-15 17:05:00
490
原创 Java并发——循环栅栏CyclicBarrier源码解析
从CyclicBarrier类的名字来看,它是循环栅栏,是栅栏机制的一种实现,它在内部利用ReentrantLock锁以及Condition的线程协调机制来实现这一功能。
2018-12-14 21:32:31
598
原创 Java并发——闭锁CountDownLatch、信号量Semaphore类源码解析
CountDownLatch类是AQS框架闭锁机制的一种实现。Semaphore是AQS框架信号量机制的一种实现。它首先在创建时会定义一定的资源量,每个线程如果能从Semaphore里得到足够的资源,那么该线程就会得到执行,而如果得不到足够的资源,那么AQS会把线程置于同步队列中,来等待前面获得资源的线程执行完毕释放资源
2018-12-13 16:04:24
468
原创 Java并发——ReentrantLock可重入锁、ReentrantReadWriteLock读写锁源码解析
ReentrantLock类是Java并发包里可重入锁的实现,同时它的大部分功能交由同步器AQS框架完成,它是AQS独占锁的实现。ReentrantReadWriteLock中文名字叫做可重入读写锁,其内部含有两种锁,一种是读锁,另外一种是写锁。它规定了最多
2018-12-12 17:50:13
1088
原创 Java并发——LockSupport、Condition源码解析
LockSupport类是一个工具类,用来在显示锁里面替换Object类的wait、notify方法的。Condition在Java中是用于多线程协调通信的工具类,一般用于显示锁。在内置锁里面,wait方法必须在线程持有锁的时候才能对线程进行阻塞,但是LockSupport类却不一样,即使线程没有持有锁,它也能将该线程阻塞。
2018-12-11 17:58:39
234
转载 Java并发——AQS框架源码详解
谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)。类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch等等。
2018-12-10 21:46:41
246
原创 Java并发——CAS原子操作、java.util.concurrent.atomic原子变量类源码解析
比较并交换(compare and swap, CAS),是原子操作的一种,可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生的数据不一致问题。 该操作通过将内存中的值与指定数据进行比较,当数值一样时将内存中的数据替换为新的值。
2018-12-09 16:16:02
284
原创 Java并发——volatile关键字、有序性浅谈
volatile关键字是一种比锁机制稍弱点的同步机制,volatile变量会被编译器以及JVM运行时注意到是一个共享变量,被它修饰的变量具有两大特征:第一,保证了不同线程对该变量的可见性。被它修饰的变量在线程中被修改后会立马写入主存中,在Java内存模型中,volatile变量的写入操作与读取操作同时到达的时候,将先进行写入操作,来保证数据的一致性。
2018-12-06 21:18:04
275
原创 Java并发——synchronized关键字,内置锁解析,可见性,互斥性浅谈
Java中为了保证每个线程中的原子操作,引入了内置锁,或者称为监视器锁,其中,每个Java对象都可以作为一个实现锁的对象,synchronized关键字修饰的代码块被称为同步代码块,线程进入同步代码块自动获取内置锁,退出同步代码块则释放锁,不需要调用者考虑它的创建以及消除,但是得十分熟悉内置锁的机制。
2018-12-06 12:18:31
675
原创 Java并发——ThreadLocal、ThreadGroup类源码解析
即线程范围之间如何实现数据的共享。其实很简单,利用一个Map来存贮,键存贮线程的名字、id等数据,而值则存贮着该线程对应共享的数据,将该Map传进对应的线程就可以实现数据的共享了,但是得注意同步。防止出现"脏数据"。而ThreadLocal类的存贮策略与上述相似,但是它只保存着每个线程的对应的本地数据,一个线程并不能访问ThreadLocal里另外一个线程保存的数据。说了这么多,还没正式的介绍ThreadLocal类,中文名是本地线程类,
2018-11-28 20:51:20
401
原创 Java并发——Thread类源码解析、线程初探
线程相较于进程,它是轻量级的,并且一个进程可以包含多个线程,这多个线程之间共享该进程的资源,且每个线程自己独占一份内存,这个空间叫做线程栈,是由系统创建该线程时创建的,主要是保存线程中的自定义的数据等。注意的是,线程依托于进程,当该进程消亡时,进程内所有的线程也会跟着消亡。而Java中的线程是抢占式的
2018-11-27 22:49:24
361
原创 Java源码分析——java.util工具包解析(五)——UUID、Base64、内置观察者模式Observer接口、EventListener、RandomAccess
对UUID、Base64、内置观察者模式Observer接口、EventListener、RandomAccess的使用以及一些思考
2018-11-25 16:23:52
339
原创 Java源码分析——java.util工具包解析(四)——四大引用类型以及WeakHashMap类解析
WeakHashMap是Map的一种很独特的实现,从它的名字可以看出,它是存贮弱引用的映射的,先来复习一下Java中的四大引用类型: 1. 强引用:我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。强引用的对象垃圾回收器绝不会回收它。当内存空间不足,jvm宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。 2. 软引用:软引用是当jvm中内存不够的情况下会回收其对象,在内存充足的情况下与强引用别无二样。
2018-11-24 17:14:03
226
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人