- 博客(85)
- 资源 (5)
- 收藏
- 关注
转载 彻底弄懂HTTP缓存机制及原理
前言Http 缓存机制作为 web 性能优化的重要手段,对于从事 Web 开发的同学们来说,应该是知识体系库中的一个基础环节,同时对于有志成为前端架构师的同学来说是必备的知识技能。 但是对于很多前端同学来说,仅仅只是知道浏览器会对请求的静态文件进行缓存,但是为什么被缓存,缓存是怎样生效的,却并不是很清楚。 在此,我会尝试用简单明了的文字,像大家系统的介绍HTTP缓存机制,期望对各位正确的理解前端
2017-08-11 10:53:32 311
原创 响应式编程-reactor
reactor作为一种响应式编程具体实现,能够跟踪异步场景下的数据流和数据状态变更。在Java9中已经集成了响应式编程的接口,类名为Flow。现在的硬件已经非常厉害了,但是随着并发量的增加,仍然会达到瓶颈。现在主要有两个方式解决程序的系统:(1)并行:单机维度增加线程,集群维度扩机器;(2)高效的资源利用:寻找更有效的方式利用当前已有的资源;现在我们传统的做法是写阻塞式的代码,如果出现性能瓶颈,可能会想办法提升并发度,但是这种方式可能会导致竞争和并发等问题。
2024-11-04 22:27:50 482
原创 读书笔记#跃迁:成为高手的技术#
在这个复杂的社会里,在每时每刻有太多的选择了,有的选择让你过得很艰难,而有的选择可以让你实现财富自由、人生自由。需要培养一个基于价值的抉择能力,能快速选择一个高价值区,完成人生的跨越;选择指数增长的路径,不要总是想逆水行舟,如果人生就是100米的河,别人顺水早早完成了人生的翻越,你逆着水流,不仅痛苦,而且很难达成人生的目标;升级思维、系统性思考、设计可迭代增长的回路、进行层级性问题解决、找到控制点;功力学习法、联机学习者、终身提问者、知识IPO、自下而上;只打甜蜜区的球、幂律分布、头部效应、专注、迭代;
2024-10-29 12:55:44 127
原创 netty入门篇
先说好,这里所说的入门篇,并不是教你们如何入门,而是在我研读部分源码后,写了一个基本的demo,实现了客户端和服务端的交互,在放出我写的源码之前,写简单介绍下netty中的一些核心概念和核心类。NIO模型NIO是相对于BIO的一个概念,BIO是阻塞IO,不管进行accept、connect、read、write操作都可能导致阻塞。NIO就是大家常说的非阻塞模型,但是我感觉还是采用多路复用的思想...
2019-12-07 21:51:18 439
原创 用代码和图告诉你VisualVM中的线程的几种状态
VisualVM是压测过程中经常用到的一个工具,但是在分析过程中对其中的几种状态了解的不太清楚,通过查阅资源和代码中测试,基本搞懂了这些状态的区别。状态说明:Running处于这种状态的线程对于操作系统而言,要么是正在占用CPU时间片运行的线程,要么是已经就绪的线程,只要有CPU时间片分配到,就可以直接运行,对应Java中Runnable状态。Sleeping处于睡眠状态的线程...
2019-11-30 17:15:46 2663
原创 ConcurrentHashMap思维导图(1.8版本)
思维导图核心操作put主要步骤:1、判断key或者value是否为null,是的话抛出异常;2、计算key的hashcode;3、判断容器table是否为null,或者长度为0,是的话进行初始化工作;4、定位key所在的位置,如果此位置没有元素的话,通过cas方式插入元素,直到成功;5、如果有元素的话,判断此时是否在扩容,如果是的话,帮助一起扩容(多个线程一起搞,这个过程挺复杂的...
2019-11-24 12:19:07 507
原创 谈谈HashMap结构那些事~(1.8版本)
1.8版本之前的HashMap结构也没仔细看过,趁着有时间把1.8版本HashMap结构梳理了一遍。下面就是几个总结。HashMap底层就是借助于数组+链表+红黑树实现的。其中红黑树是1.8中引入的,引入的目的就是防止数组中单个节点的链表过长,导致查询速度慢,通过借助于红黑树(自平衡二叉树)良好的查询速度,提升查询性能。/** * The table, initialized on...
2019-11-20 23:56:00 243
原创 DBCP2的核心参数配置
1、核心的包<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>${commons.pool.version}</version></depende...
2019-11-11 18:24:02 1753
原创 mybatis中的主要设计模式应用
mybatis中包含很多中设计模式,主要包括:建造者模式、工厂模式、单例模式、模板方法模式、组合模式、代理模式、适配器模式、装饰器模式、迭代器模式。Builder模式对象的构建过程过于复杂,可以使用建造者模式,将对象的创建过程和表示过程相分离。MapperAnnotationBuilderMapper的注解构建者。当在配置文件中直接定义下面的语句时,就需要通过这个构建器进行注解解...
2019-11-06 00:51:14 224
原创 常用排序算法
基本概念介绍稳定排序对于待排序的数据,如果有元素a和b相等,如果排序前a在b的前面,在排序后a还是在b的前面,则称之为稳定排序。非稳定排序对于待排序的数据,如果有元素a和b相等,如果排序前a在b的前面,在排序后a可能出现在b的后面,则称之为非稳定排序。内排序待排文件的数据都是在内存储器中进行的。外排序如果数据很大,内存无法直接加载完成的数据,排序过程需要借助于内外存数据的交换来完...
2019-10-27 21:37:08 171
原创 spring的初始化过程
spring是什么?为什么需要spring?spring是一个容器框架,bean的创建和管理都交给spring来管理。spring中几个核心概念。IOC(Inversion of Control):控制反转传统的代码中对象之间的耦合性太强,通过将对象交于spring容器管理,由容器来控制程序之前的依赖关系。其还有一个名字:DI(依赖注入),即如果对象之间存在依赖关系,又spring容器...
2019-10-25 18:49:43 449
原创 BST、AVL、B-、B+、红黑树的基本定义和结构
BST即二叉搜索树基本定义:对于任意一个节点,若有左子树,则左子树的所有节点都小于当前节点;若有右节点,则所有右节点都大于当前节点,即满足递归定义。AVL即平衡二叉搜索树基本定义:二叉搜索树(BST)的性质,平衡二叉搜索树也满足;对于任意一个节点,若其左子树的树高为HL,其右子树的树高为HR,则||HL-HR|| < 2B-树基本定义:(M阶B-树)对于节...
2019-10-24 22:13:09 577
原创 二十三种设计模式-访问者模式
访问者模式(Visitor)在现实世界中,访问者又叫做拜访者。客人到主人家做客,客人就是一个拜访者。对主人来说,你来与不来,我都在那里。什么是访问者模式访问者是一种行为型模式,主要是对象自身的结构和对象的具体行为相分离,通过一个对象维护对象自身的结构(这个结构不能是易变的,否则这种模式就没太大的意义了),通过另一个对象(就是我们说的访问者)维护施加在对象结构上的行为。通过将对象的结构和行为...
2019-10-18 11:42:58 259
原创 SynchronousQueue数据结构基本介绍
SynchronousQueue特点是阻塞队列BlockingQueue的一种实现,也就是方法具有BlokingQueue的基本性质;和ArrayBlockingQueue区别在于,ArrayBlockingQueue内部会有一个数组用于存放元素,相当于一个缓存区;而对于SynchronousQueue,内部没有这样的数据结构用于存放数据。对于具体的一个线程A,想要插入数据,必...
2019-10-17 18:47:17 410
原创 二十三种设计模式-桥梁模式
主要的作用将抽象与实现解耦,可以让抽象和实现独立的变化。关键角色(1)Abstraction:抽象角色,这个角色提供的接口是面向调用方的,其中会保持一个对实现化对象的引用,其中的真正实现就是由Implementor的实现类来提供的,Implementor就相当于一个桥梁,将抽象角色和具体的实现关联了起来,使用组合的方式,而不是继承的方式。(2)RefinedAbstraction:修正...
2019-10-14 23:54:32 209
原创 你希望你接手的系统具有哪些优点?
对于一个已经生存很久的公司来说,你会发现它的很多系统已经发展了很久很久,当你初次接手维护很久的系统时,第一步就是先了解这个系统的作用,然后研究内部的代码逻辑。二丫今年刚研究生毕业,作为一名计算机系统的妹子,也在和毕业生大军竞争一个工作,幸运的是,一个互联网大公司录取了她。今天是第一天,提前过来实习。leader:“你好,欢迎加入本公司,你刚来,就先看看代码吧,来,我给你加几个source权...
2019-10-13 22:45:11 152
原创 详解IP、TCP报文头部及报文封装过程
TCP报文字段介绍:1、源端口(16bit):一个端口所属一个进程,可以通过源端口定位到具体的进程;2、目的端口(16bit):通过目的端口和Ip报文的目的ip地址可以唯一定位到一个进程;3、序号(32bit):当前发送数据的其实需要,每一个字节都和一个序号对应,通过需要可以保证数据的有序性;4、确认序号(32bit):只有哦ACK为1时确认需要才有效,表示期望下一次希望收到的数据的起...
2019-10-13 11:39:26 14884
原创 tomcat容器架构及请求和相应过程
基本容器结构如下:请求和响应架构:核心类介绍:1、 tomcat的启动入口:Bootstrap这个类是tomcat启动的入口类,看看main函数:public static void main(String args[]) { synchronized (daemonLock) { if (daemon == null) { ...
2019-10-12 21:39:16 296
原创 CyclicBarrier实现原理
引言在写一个知识点之前,总是想说点废话。进程、线程之类的是操作系统级别上的概念,在此概念基础上使我们能够充分压榨CPU的处理能力,实现了并发和并行。但是呢,一涉及多线程的问题,总是有点不可控的感觉,对于线程的调度,很大程度上受操作系统调度算法的控制,而操作系统也开发了一些核心的api,可以让我们在用户的应用层面控制线程。像CyclicBarrier就让我们在一定程度上,控制了多个线程的逻辑流,...
2019-10-08 23:31:48 273
原创 理解Semaphore的实现原理
简介相当于是一个计数信号量,用于控制共享资源的访问,比如实例化时可以用N表示访问共享资源的计数器。每访问一次,都会将访问的剩余次数进行减一。也是通过AQS来实现此功能的。实现原理(1)借助于AQS来实现,实例化时传入一个许可证的次数,将此值设置为state。public Semaphore(int permits) { sync = new NonfairSync(perm...
2019-10-08 20:50:12 607
原创 CountDownLatch详解
简介通过这个类可以控制线程的执行顺序,比如有三个线程A、B、C,我需要在A、B两个线程执行完某个步骤之后再执行线程C的某些步骤,则可以通过CountDownLatch这个类进行控制,实现原理也是通过AQS来实现的。大家可以看看CountDownLatch这个类的源码,在源码的注释中给了一个很好的例子,后面我也会给出我本地测试的一个例子。实现原理核心的内部类Sync继承了Abstra...
2019-10-08 00:02:51 181
原创 Mysql系列:Sql语句执行过程和事务
前言 如果一个后端开发人员经常要与mysql打交道的话,那么写Sql语句在所难免,如果不了解一个Sql的执行过程,那可能会写出一个很烂的Sql语句,导致慢查询,严重影响服务器的性能。 对于Mqsql中的事务,...
2019-10-06 14:04:34 1192
原创 Java内存模型:深入理解java内存模型和先行发生原则
在讲解java的内存模型之前,咱们先看看物理机上的内存模型。硬件的缓存结构正如上面所看到的,每一个处理器都会有自己独自的缓存,而且可能会有一层缓存时多个处理器是共享的,最底层一层的缓存连接着主存,相当于是主存的部分缓存数据。Java的内存模型上面的图虽然画的简陋了点,但也基本表明线程、工作内存、主内存的交互情况。Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变...
2019-10-04 23:29:37 172
原创 java虚拟机:一篇让你了解垃圾收集策略和垃圾收集核心知识
什么是垃圾收集?在我们所看到的很多讲解JVM书籍知识的文章中,总会看到如下一句话:java和C++之间有一堵由内存动态分配和垃圾收集技术围成的“高墙”,墙外的人想进来,墙里的人想出去。感觉这句话挺有意思的,使用C++的程序员在管理内存方便有着至高无上的权利,内存的分配和释放都是由程序员直接控制的,如果分配了内存,但是忘记释放了,就会很容易出现内存溢出的问题,C++程序员饱受其折磨。而使用Jav...
2019-10-04 13:00:28 161
原创 java虚拟机:详解jvm的内存布局和内存溢出异常
运行时数据区域主要包括如下几部分:堆(Heap)在这个多线程的架构体系中,咱们知道有的区域是线程私有的,而有的区域是线程共享的。对于堆区,就是线程共享的,不管是堆还是栈,底层都是一个物理机的主存而已,在此基础上,JVM进行了逻辑分块,有了堆、栈的概念,比如JVM认为物理地址0x0000~0x2321为堆区,他就是堆区了。堆是用来干什么的呢?java是面向对象的语言,所以用new创建一个对象...
2019-10-03 21:35:24 197
原创 BlockingQueue之ArrayBlockingQueue实现原理
BlockingQueue之ArrayBlockingQueueArrayBlockingQueue是一个基于数组实现的有界限的阻塞队列,队列中的元素也是先进先出。在说ArrayBlockingQueue之前,先来看看其接口BlockingQueue,接口中提供了一些比较有意思的方法,当我们调用其中的方法时,会表现出一下四种行为之一:直接抛出一个异常(Throws Exception)返...
2019-10-02 17:25:26 552
原创 ThreadPoolExecutor线程池实现原理
ThreadPoolExecutor线程池实现原理线程池在工作中用到很多,也清楚其中的一些参数的配置,但是呢,总是对怎么标识空闲线程、活动线程不太清楚。空闲线程具体是怎么回收的?我之前一直在想一个线程的run方法执行完之后这个线程不就会被销毁了吗?怎么实现重复利用的呢?带着这些疑问,看了看底层的源码。先来看看ThreadPollExecutor的继承结构Executor接口中就一个ex...
2019-10-02 11:55:52 152
原创 二十三种设计模式-适配器模式
解决的问题拿例子来说吧。1、我要把我电脑中的各种重要的小电影拷贝的一个U盘上去,免得电脑的固态硬盘坏了导致资源丢失了,但是呢,我的mac的接口是type-C的,而U盘用的是USB接口,导致U盘无法插入mac中去。这时候我就在网上买了一个转接口,其中一头是type-C接口,一头支持USB接口插入,这样就可以将U盘和mac联系起来了。其中有三个重要的对象:目标对象(可以接入mac中的U盘)、源对象...
2019-10-01 16:39:35 256
原创 ReentrantLock原理介绍和源码解析
ReentrantLock原理介绍和源码解析AQS讲解ReentrantLock之前还是得先说AQS,AQS全称AbstractQueuedSynchronizer。正如源码的文档所说,这是依赖于FIFO队列提供的一种实现阻塞队列和相关联同步器(信号量、事件等等)的一种框架。像我们平常用的ReentrantLock、Semaphore、CountDownLatch、ThreadPoolExec...
2019-09-29 19:41:58 174
原创 IO模型
I/O模型两个关键词:内核空间和用户空间;io操作时,比如网络IO读,首先数据会先到达内核空间,然后在内核态将内核空间的数据copy到用户空间。如果写数据时,也是通常将用户空间的数据copy到内核空间,然后在将内核空间的数据发送出去。但目前有很多IO优化技术,比如:direct io、mmap、sendfile等。1、阻塞I/O模型发出一个请求,直到数据返回,一直处于等待状态,不做...
2019-09-19 16:51:58 160
原创 mybatis:mybatis-config.xml解析
Mybatis配置文件解析基本元素:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"&g...
2019-09-17 21:03:58 162
原创 计算机系统的学习-笔记1
计算机系统漫游1、并发和并行并发:指一个同时具有多个活动的系统并行:指的是用并发来使一个系统运行的更快。2、计算机三个层次实现并发和并行(1)线程级并发(2)指令级并行通过借助于流水线(pipelining)技术,将执行一个指令所需要的活动划分为不同的步骤,将处理器的硬件组织成一系列的阶段,每一个阶段执行一个步骤,这些阶段可以并性地操作。(3)单指令、多数据并行允许一条指令产生多...
2019-09-15 23:31:37 182
原创 spring aop的实现代码
跟踪spring aop的实现aop核心概念介绍什么是切面编程在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面编程。Aspect(切面)什么是切面呢?切面这个词感觉还是挺抽象的,咱们可能知道点构成线,线构成面的数据话术。但是在编程语言中如何体现这个面呢?我的理解是“在程序中切面是由切入点和在切入点的表现的行为构成”。给个在spring中定义切面的例子如下...
2019-09-14 19:45:39 1158
原创 二十三种设计模式-原型模式
原型模式原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是原型模式的用意。这种形式涉及到三个角色:客户(Client)角色:客户类提出创建对象的请求。抽象原型(Prototype)角色:这是一个抽象角色,通常由一个Java接口或Java抽象类实现。此角色给出所有的具体原型类所需的接口。具体原...
2019-09-14 15:45:22 132
原创 算法-最短路径(动态规划法)
问题描述猛兽侠中精灵鼠在利剑飞船的追逐下逃到一个n*n的建筑群中,精灵鼠从(0,0)的位置进入建筑群,建筑群的出口位置为(n-1,n-1),建筑群的每个位置都有阻碍,每个位置上都会相当于给了精灵鼠一个固定值减速,因为精灵鼠正在逃命所以不能回头只能向前或者向下逃跑,现在问精灵鼠最少在减速多少的情况下逃出迷宫?输入描述第一行迷宫的大小: n >=2 & n <= 10000;...
2019-09-10 22:28:42 3154
原创 算法-最高得分(动态规划)
题目描述小明同学在参加一场考试,考试时间2个小时。试卷上一共有n道题目,小明要在规定时间内,完成一定数量的题目。 考试中不限制试题作答顺序,对于 i 第道题目,小明有三种不同的策略可以选择: (1)直接跳过这道题目,不花费时间,本题得0分。(2)只做一部分题目,花费pi分钟的时间,本题可以得到ai分。 (3)做完整个题目,花费qi分钟的时间,本题可以得到bi分。小明想知道,他最多能得到...
2019-09-04 00:23:34 2326
原创 java线程知识
线程核心:锁对于共享资源,在多线程的环境中,是会存在竞争情况的,由于竞争的存在,导致在使用共享资源的情况,会出现意想不到的情况。如果共享资源仅仅是可读的,不管多少线程来操作,也不会出现线程安全的情况。但如果在使用共享资源的时候,会改变共享资源的状态,那么基本会出现线程安全的问题。锁是什么呢?既然资源存在竞争,那么当一个线程在占用了资源后,想办法告知其他想使用其资源的线程当前资源正在占用中,让其...
2019-09-02 22:32:22 111
原创 java泛型-super和exends
什么是泛型泛型的本质是参数化类型,也就是所操作的数据类型被指定为一个参数(既然是参数,那么就是可变的,数据类型可变的。)。在java中,没有泛型出现之前,通过定义类型是Object来实现参数的“任意化”。使用Object实现任意化的缺点是需要强制类型转换,而且错误需要在运行期才能发现。而使用泛型的好处是在编译时的时候检查类型安全,并且所有的强制类型转化都是自动和隐式的,极大提高代码的利用率。泛...
2019-08-31 18:13:51 405
原创 springboot解决跨域问题
springboot解决跨域问题基本概念:1、同源策略:是指协议、域名、端口都要相同,只要有一个不相同,就是跨域。注:跨域限制访问是浏览器的限制2、CORS:跨域资源共享,这是一种机制,允许web服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。注:很赞的一篇介绍CORS的文章https://developer.mozilla.org/zh-CN/docs/Web/HTTP/...
2019-08-29 23:20:28 377
原创 tomcat源码阅读笔记-启动过程和请求处理过程
本文是之前第一次粗略阅读tomcat源码的一些笔记内容,涉及的东西比较散和广,之后有时间写一些tomcat的细节内容,比如组件声明周期的细节,详细分析各个组件的构建过程等。配置文件基本结构<Server> <Service> <!-- 此元素可以有一个或者多个 --> <Connector> <!-- 此元素可以有多个 --...
2019-08-28 22:53:43 239
J2EE实例教程,能够了解基本的内容
2015-07-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人