架构及性能调优
文章平均质量分 73
延进、设计模式、jvm、jmm、多线程、netty、数据结构与算法
字节跳动
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
TCP连接断开原理剖析
TCP连接三次握手TCP协议在双方建立连接的时候需要三次握手, 所谓的三次握手即TCP连接的建立。这个连接必须是一方主动打开,另一方被动打开的。以下为客户端主动发起连接的图解:其中比较重要的字段有:SYN(synchronous建立连接) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束)RST(reset重置) URG(urgent紧急)tips不要将确认序号Ack与标志位中的ACK搞混了。确认方Ack=发起方Seq+1,两端配对为原创 2021-01-07 21:26:28 · 1032 阅读 · 0 评论 -
Netty之Hessian编解码
JDK序列化使⽤是⽐较⽅便,但是它的性能较差,序列化后的字节⼤⼩也⽐较⼤,所以⼀般在项⽬中不会使⽤⾃带的序列化,⽽是会采⽤第三⽅的序列化框架。我们以Hessian为例,演示下如何与Netty整合进⾏编解码处理。导⼊Hessian依赖:<dependency> <groupId>com.caucho</groupId> <artifactId>hessian</artifactId> <version>4.0.63</v原创 2021-01-06 14:13:57 · 624 阅读 · 0 评论 -
Netty的模型演进及快速入门
BIO模型Demopublic class BIOServer { public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(6666); ExecutorService executorService = Executors.newCachedThreadPool(); while (true) { System.out.printl原创 2021-01-05 17:10:47 · 211 阅读 · 1 评论 -
lambda的函数式接口深入理解
Lambda表达式底层原理解析对含有lambda的类进行反编译省略。。。可以发现,代码中执行Lambda表达式的部分生成了一个静态私有函数。这个静态私有函数的函数干就是 Lambda表达式里面的内容。那么对于这个静态私有函数,在JDK8内部是如何实现调用的呢?可以查看 LambdaMetafactory 类,该类下有一个 metafactory方法,lambda表达式每一次在执行的时候都会进入到这个方法中,并且为lambda表达式创建一个内部类。综上所述,Lambda表达式在执行的时候,会调用L原创 2021-01-03 17:43:34 · 311 阅读 · 0 评论 -
设计模式之状态模式
定义对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。优点1、封装了转换规则。2、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。3、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。缺点1、状态模式的使用必然会增加系统类和对象的个数。2、状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代 码,否则无法切原创 2020-12-23 10:55:28 · 185 阅读 · 0 评论 -
设计模式之策略模式
定义策略模式是对算法的包装,把使用算法的责任和算法本身分隔开,委派给不同的对象管理。策略模式通常把一系列的算法包装 到一系列的策略类里面,作为一个抽象策略类的子类。优点1、算法可以自由切换。2、避免使用多重条件判断。3、扩展性良好。缺点1、策略类会增多。2、所有策略类都需要对外暴露。案例结算价格计算,根据Vip不同等级进行运算用户在购买商品的时候,很多时候会根据Vip等级打不同折扣,这里也基于真实电商案例来实现VIP等级价格制:Vip0->普通价格Vip1->减5元原创 2020-12-23 10:49:04 · 158 阅读 · 0 评论 -
设计模式之装饰者模式
定义动态的向一个现有的对象添加新的功能,同时又不改变其结构。它属于结构型模式。优点装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。缺点多层装饰比较复杂。需求在订单提交的时候,订单价格和结算价格其实是两码事,订单价格是当前商品成交价格,而结算价格是用户最终需要支付的金额,最终支付的金额并不是一成不变,它也并不是商品成交价格,能改变结算价格的因素很多,比如满100减10元,VIP用户再减5块。装饰者模式价格运算实现思路分析1、创原创 2020-12-23 09:44:34 · 168 阅读 · 0 评论 -
设计模式之架构中的代理增强模式
流程分析模拟Spring的声明式事务控制,在业务层进行增强,我们可以按照如下步骤实现:1、创建增强类TransactionManager,在里面编写一个增强方法begin2、创建一个BeanProxy对象,用于给指定包下的对象创建代理3、每次ParseXml加载解析之后,调用BeanProxy给指定包下的对象创建代理业务层代理模式增强1)指定增强位置首先在spring.xml配置文件中配置一下增强的位置,before表示前置增强, package 表示指定包下的对象进行前置增强, ref 表原创 2020-12-22 10:24:48 · 443 阅读 · 0 评论 -
设计模式之架构中的观察者模式
上篇虽然已经实现了MVC模型对应功能,但是每次调用对象都是创建了新对象,我们可以对这里进行优化,让每次调用的对象是单利对象,这时候我们就需要初始化的时候把对象创建好了,但是对象和对象之间又存在依赖关系,我们可以在配置文件中配置这种关系。这里我们可以使用观察者模式和单利模式流程分析我们编写一个类似Spring的MVC框架,这里采用观察者模式实现监听文件加载,实现步骤如下:1、编写BaseInit类,并继承HttpServlet2、重写HttpServlet中的init(ServletConfig c原创 2020-12-21 21:59:48 · 245 阅读 · 2 评论 -
设计模式之架构中的适配者模式
定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。优点:1、可以让任何两个没有关联的类一起运行。2、提高了类的复用。3、灵活性好缺点:过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。以自定义Spring架构来说明适配器视图渲染做视图解析的时候,有不同的解析方式,比如有直接输入json数据、重定向、转发、输出原创 2020-12-21 21:44:23 · 252 阅读 · 0 评论 -
设计模式之代理模式
JDK动态代理1、被代理的类必须实现一个接口2、创建代理对象的时候,用JDK代理需要实现InvocationHandler3、代理过程在invoke中实现接口public interface LandlordService { void rentingPay(String name);}被代理对象public class Landlord implements LandlordService{ /**** * @param name */ @Override public vo原创 2020-12-21 21:08:47 · 204 阅读 · 1 评论 -
GC常用参数
堆栈设置-Xss:每个线程的栈大小-Xms:初始堆大小,默认物理内存的1/64-Xmx:最大堆大小,默认物理内存的1/4-Xmn:新生代大小-XX:NewSize:设置新生代初始大小-XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。-XX:SurvivorRatio:默认8表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。-XX:MetaspaceSize:设置元空间大小-XX:MaxMetaspaceSize:设置元空间最大允许大原创 2020-12-08 09:37:13 · 306 阅读 · 0 评论 -
设计模式之Spring中观察者模式
观察者模式定义对象之间存在一对多或者一对一依赖,当一个对象改变状态,依赖它的对象会收到通知并自动更新。MQ其实就属于一种观察者模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。优点 1.观察者和被观察者是抽象耦合的。 2.建立一套触发机制。缺点 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。1.Spring原创 2020-08-04 14:20:52 · 2388 阅读 · 0 评论 -
设计模式之单例模式发展
设计模式1.认识设计模式1.1设计原则优良的系统设计具备特点:1.可扩展性(Extensibility)2.灵活性(Flexibility)3.组件化可插拔式(Pluggability)2. 设计模式常用案例2.1单例模式2.1.1 单例模式-饿汉式2.1.2 多种单例模式懒汉式懒汉式有这些特点:1.延迟加载创建,也就是用到对象的时候,才会创建 2.线程安全问题需要手动处理(不添加同步方法,线程不安全,添加了同步方法,效率低) 3.实现容易但方法上加锁,性能太感人原创 2020-08-04 13:41:03 · 167 阅读 · 0 评论 -
Fork/Join
概念ForkJoin是由JDK1.7后提供多线并发处理框架。ForkJoinPool由Java大师Doug Lea主持编写,处理逻辑大概分为两步。1.任务分割:Fork(分岔),先把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割。2.合并结果:join,分割后的子任务被多个线程执行后,再合并结果,得到最终的完整输出。组成ForkJoinTask:主要提供fork和join两个方法用于任务拆分与合并;多数使用RecursiveAction(无返回值的任务)和Recursi原创 2020-11-24 21:51:18 · 502 阅读 · 0 评论 -
基于AQS自己实现锁
最大允许指定数量的线程并行运作。其他排队等候import java.util.concurrent.locks.AbstractQueuedSynchronizer;public class MyLock extends AbstractQueuedSynchronizer { public MyLock(int count){ setState(count); } @Override protected int tryAcquireShared(int arg) { for原创 2020-11-20 09:17:20 · 204 阅读 · 0 评论 -
多线程源码流程图剖析
注意点:1)线程池是如何保证线程不被销毁的呢?答案:如果队列中没有任务时,核心线程会一直阻塞在获取任务的方法,直到返回任务。而任务执行完后,又会进 入下一轮 work.runWork()中循环验证:秘密就藏在核心源码里 ThreadPoolExecutor.getTask()2)那么线程池中的线程会处于什么状态?答案:TIMED_WAITING,RUNNABLE,WAITING验证:起一个线程池,放置一个任务sleep,debug查看结束前后的状态3)核心线程与非核心线程有区别吗?答案:没.原创 2020-11-17 09:36:16 · 2760 阅读 · 1 评论 -
线程状态
线程概念线程创建方式1)、继承Thread2)、实现Runnable线程状态原创 2020-11-17 08:57:39 · 150 阅读 · 1 评论
分享