自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

大佬请赐教

经验的鸡肋,智慧的结晶

  • 博客(123)
  • 资源 (2)
  • 收藏
  • 关注

原创 Mybatis - 分析一级缓存SqlSession级别

大家都知道,两次返回结果是同一对象。且看下文分析先从openSession方法开始讲起,调用openSession会创建一个defaultSqlSession对象,同时创建一个Executor作为入参。从这里可以知道,同一个SqlSession只会实例化一个Executor,使用的是同一个Executor。同一个Executor也就使用了localCache对象,localCache是PerpetualCache类型。再看getMapper方法,getMapper内部调用的是Configura...

2020-09-30 15:57:49 113

原创 布隆过滤器解决缓存穿透

111

2020-06-03 22:11:23 151

原创 Twitter SnowFlake算法

SnowFlake算法生成的ID值是一个64bit大小的整数,结构图如下1位,不用。二进制中最高位为1的都是负数,但是我们生成的id一般都使用整数,所以这个最高位固定是0 41位,用来记录时间戳(毫秒)。 41位可以表示个数字, 如果只用来表示正整数(计算机中正数包含0),可以表示的数值范围是:0 至,减1是因为可表示的数值范围是从0开始算的,而不是1。 也就是说41位可以表示个毫秒的值,转化成单位年则是年 10位,用来记录工作机器id。 可以部署在个节点,包括5...

2020-05-23 08:50:33 86

原创 CompletableFuture使用详解

CompletableFuture引入CompletableFuture是java8引入的一个用于异步编程的工具类。我们根据CompletableFuture的简单示例来逐步介绍它的强大功能。 final CompletableFuture<String> cf = new CompletableFuture<String>(); T...

2020-05-07 15:52:24 287 2

原创 Guava之EventBus实战

EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和接口层次结构。定义EventBus@Configurationpublic class EventBusConfig { @Autowired private Applic...

2020-04-30 15:29:07 125

原创 Netty之心跳重连

心跳定义心跳即在TCP长连接中,客户端和服务器之间定期发送的一种特殊的数据包,通知对方自己还在线,以确保TCP连接的有效性。为什么需要心跳因为网络的不可靠性,有可能在TCP保持长连接的过程中,由于某些突发情况,例如网线被拔出,突然掉电等,会造成服务器和客户端的连接中断。在这些突发情况下,如果恰好服务器和客户端之间没有交互的话,那么它们是不能在短时间内发现对方已经掉线的.。为了解决这个问题,我...

2020-04-30 11:17:24 109

原创 Redis发布订阅模式

redis发布订阅架构Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者,订阅者和Channel。发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。Redis的这种发布订阅机制与基于主题的发布订阅类似,Channel相当于主题。JAVA实现方式redi...

2020-04-27 16:35:32 78

原创 Netty之粘包拆包解决

粘包拆包表现形式产生粘包和拆包问题的主要原因是,操作系统在发送TCP数据的时候,底层会有一个缓冲区,例如1024个字节大小,如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP则会将多个请求合并为同一个请求进行发送,这就形成了粘包问题;如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP就会将其拆分为多次发送,这就是拆包,也就是将一个大的包拆分为多个小包进行发送。下面示意图能更加形象的说...

2020-04-27 15:30:22 87

原创 @RequestBody注解

1.使用@RequestBody接收页面参数: type: "POST", data: JSON.stringify({ "actiName":name }), dataType: "json", contentType: "application/json"2.不使用@RequestBody接...

2020-04-22 16:49:52 62

原创 实例分析join、left join、right join、fulljoin间的区别

分析INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN的ON、WHERE后面跟条件的区别准备表结构、数据新建表TAB1和TAB2,TAB1字段ID,SIZE;TAB2字段SIZ,NAMESELECT * FROM TAB1 LEFT JOIN TAB2 ON TAB1.SIZ = TAB2.SIZ,这里会生成一张临时表左连接SELECT * FROM TA...

2020-04-03 18:28:15 194

原创 linux日常命令

一.grepgrep -n '关键字' log.logvim +n log.log二.sz、rzsz filename(下载)sz参数:-a以文本方式传输ascii,-b二进制方式传输binary, -e控制字符转义,保证文件传输正确sz -a files确定为文本文件sz -be files确定为二进制文件rz(上传)rz参数:-b二进制方式,默认文本方式,-e =对所有控制字符转义...

2020-02-29 16:47:06 76

原创 Netty之HashedWheelTimer源码分析

简介HashedWheelTimer是Netty的一个工具类,来自netty-common包,简单来说用于实现延时任务。使用场景:dubbo失败重试、netty中长连接超时(如客户端由于网络原因导致无法传送心跳至服务端)。优缺点优点:添加、删除、取消延迟任务,能高效地处理大批定时任务缺点:占用内存较高、避免创建多个HashedWheelTimer实例,时间精度要求不高结构图先根据上...

2020-02-26 12:37:26 221

原创 java读写锁ReentrantReadWriteLock源码分析

ReentrantReadWriteLock简介①读写锁在同一时刻可以允许多个读线程访问,但在写线程访问时,所有的读线程和其他写线程均被阻塞。保证了写操作对读操作的可见性②读写锁维护了一对锁,一个读锁和一个写锁,分离读写锁提升并发性能③一般情况下,读写锁比排它锁有更好的吞吐量和并发性ReentrantReadWriteLock特性公平性:支持公平和非公平获取锁方式,非公平吞吐量优于公平重...

2020-02-19 12:56:16 235

原创 浅析线程

线程与进程进程具有一定独立功能的程序,它是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源。在运行时,只是暂用一些计数器、寄存器和栈。两者关系一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程(通常说的主线程)。同一进程的所有线程共享该进程的资源。线程是进程内的...

2020-02-08 18:12:40 124

原创 java线程池 - Executor框架源码解析

为何使用线程池技术1.线程是重量级资源,线程创建、销毁需要耗费较大的性能,因此重复使用线程能极大地改善程序性能。2.线程并不是越多越好,线程数量和性能呈抛物线关系,而且通过new Thread方式创建的线程无法很好地进行管控。3.new Thread方式创建的线程不利于扩展,比如定时、定期执行任务,线程中断。线程池如何提升性能主要是避免了线程的创建、销毁这部分时间的耗费1.普通线程执行某...

2020-02-05 16:56:34 98

原创 FutureTask源码解析二

本篇主要介绍FutureTask源码我们知道FutureTask实现了RunnableFuture接口,即Runnable接口和Future接口,Runable可以对应FutureTask的task,表示FutureTask本质上也是一个task任务,而Future对应FutureTask中的Future,表示了我们对于这个task任务可以执行某些操作,如判断任务是否执行完毕,获取任务的执行结果...

2020-01-18 20:07:21 110

原创 FutureTask源码解析一

考虑到文章篇幅过长,分为两篇讲解本片主要介绍FutureTask涉及的一些接口和基本知识FutureTask简介FutureTask是一种可取消的异步计算任务,它实现了Future接口,代表了异步任务的返回结果。从而FutureTask可以启动和取消异步计算任务、查询异步计算任务是否完成和获取异步计算任务的返回结果。只有异步计算任务结束时才能获取返回结果,当异步计算任务还未结束时调用get...

2020-01-18 16:09:46 83

原创 ThreadGroup线程组

ThreadGroup简介顾名思义,线程组是多个线程的集合,可以对一批线程或线程组进行统一管理,比如中断interrupt(),destroy()。另外可以准确的定位到某个线程和进行统一的异常捕获。一个线程组中可以有线程,也可以有线程组,所以线程组的结构有点类似于树,如下所示下面通过代码来看,线程组的树形结构 public static void main(String[] a...

2020-01-17 21:38:58 86

原创 ThreadLocal原理分析

ThreadLocal简介ThreadLocal线程本地变量的副本,对一个线程内的变量的修改不影响其它线程的变量。即在多线程环境下,可以保证各个线程之间的变量互相隔离、相互独立。①ThreadLocal实例通常在类中被定义为private static②ThreadLocal在线程的生命周期内起作用③空间换时间的设计思想ThreadLocal用法首先了解下ThreadLocal的基本用法...

2020-01-15 22:34:46 64

转载 AQS源码分析三

第一篇基于ReentrantLock公平锁分析了AQS的核心第二篇主要分析了Condition的实现原理以及线程中断的使用该篇主要的关注点是AQS的共享模式本文主要基于CountDownLatch来分析AQS的共享模式,同时分析了CyclicBarrier、Semaphore。CountDownLatchCountDownLatch是一个典型的AQS共享模式的使用使用场景:比如有N个任务,...

2020-01-11 16:43:54 59

转载 AQS源码分析二

上一篇讲解了从ReentrantLock公平锁源码了解AQS主要实现原理本文关注以下几点内容①深入理解ReentrantLock公平与非公平锁区别②深入分析AQS的内部类ConditionObject③深入理解Java线程中断和InterruptedException异常公平锁和非公平锁// 默认采用非公平锁public ReentrantLock() { sync = ne...

2020-01-08 21:48:48 77

转载 AQS源码分析一

AbstractQueuedSynchronizer(简写AQS)这个抽象类,它是Java并发包的基础工具类,是实现ReentrantLock、CountDownLatch、Semaphore、FutureTask等类的基础。本文将从ReentrantLock公平锁源码出发,分析下AbstractQueuedSynchronizer工作原理AQS结构AQS属性及含义// 头结点,你可以理...

2020-01-06 22:16:03 58

转载 LongAdder原理分析

LongAdder由来LongAdder类是JDK1.8新增的一个原子性操作类。AtomicLong通过CAS算法提供了非阻塞的原子性操作,相比受用阻塞算法的同步器来说性能已经很好了,但是JDK开发组并不满足于此,因为非常搞并发的请求下AtomicLong的性能是不能让人接受的。如下AtomicLong 的incrementAndGet的代码,虽然AtomicLong使用CAS算法,但是CA...

2020-01-05 20:29:27 3836 1

原创 java原子类

什么是原子类原子是最小粒度的,操作不可分割的。原子类作用对多线程访问同一个变量,我们需要加锁,而锁是比较消耗性能的,JDk1.5之后, 新增的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式, 这些类同样位于JUC包下的atomic包下,发展到JDk1.8,该包下共有17个类, 囊括了原子更新基本类型、原子更新数组、原子更新属性、原子更新引用jdk1.8新增原子类Do...

2020-01-04 20:03:54 125

转载 java阻塞队列之SychronousQueue

SynchronousQueue原理详解-公平模式https://www.cnblogs.com/dwlsxj/p/Thread.htmlSynchronousQueue原理详解-非公平模式https://www.cnblogs.com/dwlsxj/p/synchronousqueue-unfair-pattern.html

2020-01-01 17:19:54 125

原创 java阻塞队列之LinkedBlockingQueue

LinkedBlockingQueue简介①LinkedBlockingQueue底层数据结构单向链表②获取元素按照FIFO原则③头尾通过独立的锁来控制并发④可以构建时指定容量,默认为Integer.MAX_VALUE,无界队列,使用时注意内存溢出问题!​​​​LinkedBlockingQueue内部属性// 链表结点结构static class Node<E> {...

2019-12-30 15:18:36 70

原创 java阻塞队列之LinkedTransferDeque

LinkedBlockingDeque是一种支持双向并发的阻塞队列。LinkedBlockingDeque特性1.底层数据结构双向链表。2.同时支持FIFO和FILO,从队列的头和尾同时操作(插入/删除)。3.线程安全,使用重入锁ReentrantLock和两个Condition来控制并发。4.容量可选(防止过度膨胀),即可以指定队列的容量。如果不指定,默认容量大小等于Integer.MA...

2019-12-27 11:04:26 73

转载 java阻塞队列之LinkedTransferQueue

https://segmentfault.com/a/1190000016460411?utm_medium=referral&utm_source=tuicool

2019-12-23 11:15:33 43

原创 java阻塞队列之DelayQueue

DelayQueue简介一个支持延时获取元素的无界阻塞队列。里面的元素全部都是“可延期”的元素,列头的元素是最先“到期”的元素,如果队列里面没有元素到期,是不能从列头获取元素的,哪怕有元素也不行。也就是说只有在延迟期到时才能够从队列中取元素。DelayQueue使用场景1.清掉缓存中超时的数据2.超时任务处理DelayQueue特性1.使用重入锁ReentrantLock和avail...

2019-12-20 17:41:42 76

原创 java阻塞队列之ArrayBlockingQueue

ArrayBlockingQueue简介它是 BlockingQueue 接口的有界队列实现类,底层采用数组来实现。ArrayBlockingQueue的特性1.其并发控制采用可重入锁来控制,不管是插入操作还是读取操作,都需要获取到锁才能进行操作,它采用一个 ReentrantLock 和相应的两个Condition来实现。2.采用FIFO的原则对元素进行排序添加3.既然是有界,它在示...

2019-12-19 23:04:02 69

原创 java阻塞队列之PriorityBlockingQueue

PriorityBlockingQueue简介它是一个数组实现的带优先级无阻塞队列并发安全队列。PriorityBlockingQueue的特性1.PriorityBlockingQueue内部是一个数组queue,但是其实数据结构是使用数组实现的一个最小堆,压入队列时需要计算最小堆,弹出队列时需要重新调整根节点。2.带优先级的队列(带排序功能)。3.无界队列,默认队列大小为11,当队列满...

2019-12-19 22:26:03 66

原创 NIO selector多路复用

public class NioServer { // 通道选择器,监控多个Channel并决定哪些channel能进行读或写,一个selector管理多个channel private Selector selector; public NioServer init(int port) throws IOException{ // 创...

2019-11-14 11:36:53 56

原创 Netty启动流程

1. 服务端启动流程// ServerSocketChannel初始化注册过程bind(int inetPort)- doBind(final SocketAddress localAddress)- initAndRegister()- this.channelFactory.newChannel()(实例化NioServerSock...

2019-11-13 17:46:30 103

原创 hmily源码解读

一阶段TRYING入口点orderService.orderPayorderService.orderPay -> CglibAopProxy$DynamicAdvisedInterceptor.intercept -> methodProxy.invoke -> OrderServiceImpl.orderPay业务...

2019-10-31 11:35:37 161

原创 tcc-transaction源码解读

一.try阶段入口点PaymentServiceImpl.makePayment方法的@Compensable注解,该注解会被aop拦截。CompensableTransactionAspect切面拦截进入CompensableTransactionInterceptor的interceptCompensableMethod,此时事务类型ROOT全局事务,执行rootMethodProcee...

2019-10-25 15:30:46 135

原创 spring依赖注入的对象类型

什么情况下spring对注入的是代理对象及普通对象?前提开启事务注解<tx:annotation-driven/>① service方法添加@Transactional注解或者加入其它aop拦截配置,并且没有实现接口注入的service是代理对象(CGLIB代理)。② service方法添加@Transactional注解或者加入其它aop拦截配置,并且实现了接口方法...

2019-10-24 13:32:05 215

原创 了解escape、unescape

escape(charstring)方法作用:对String对象进行编码,以便他们能够在所有计算机上可读参数:参与编码的任意String对象或文字返回值:返回一个包含了charstring内容的字符串值(Unicode格式)①所有空格、标点、重音符号及其它非ASCII字符都用%xx(xx等于表示该字符的十六进制数)编码代替,如空格返回的是 "%20",>返回的是"%3e"。②字符值...

2019-06-26 10:55:26 615

原创 linux进程性能查看命令

一、linux下查找java进程占用cpu过高原因1.查看进程top命令查看进程占用资源情况2.查找线程top -H -p <pid>查看线程占用情况3.查找java的堆栈信息将线程id转换成十六进制printf "%x\n" 156644.使用jstack查询线程堆栈信息jstack <pid> | grep -a 20 线程id(十六进制) 定位到...

2019-04-22 12:05:51 576

转载 MongoDB GridFS

GridFS简介GridFS是Mongo的一个子模块,使用GridFS可以基于MongoDB来持久存储文件。并且支持分布式应用(文件分布存储和读取)。作为MongoDB中二进制数据存储在数据库中的解决方案,通常用来处理大文件,对于MongoDB的BSON格式的数据(文档)存储有尺寸限制,最大为16M。但是在实际系统开发中,上传的图片或者文件可能尺寸会很大,此时我们可以借用GridFS来辅助管理这...

2019-04-17 09:56:28 3695

原创 MongoDB自动增长

MongoDB没有像SQL一样有自动增长的功能, MongoDB 的_id是系统自动生成的12字节唯一标识。但在某些情况下,我们可能需要实现ObjectId自动增长功能。由于MongoDB没有实现这个功能,我们可以通过编程的方式来实现,以下我们将在counters集合中实现_id字段自动增长。下面实现_id字段从1,2,3,4到n的自动增长功能1.创建counters集合使用 pr...

2019-04-16 14:00:49 138

tomcat-7.0.42-src源码爱好者(已编译导入直接可用)

tomcat源码爱好者,了解tomcat内部运行原理,从而更熟悉的利用tomcat,借鉴其中的框架,用于日常开发中。

2018-02-06

jquery_validate

jquery验证的各种方式,包括自定义,远程remote验证等等

2010-11-15

空空如也

空空如也

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

TA关注的人 TA的粉丝

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