后端
小米软件工程师
自学编程,从英语专业成功跨考浙大计算机的研究生,目前小米全栈工程师,single dog
展开
-
java设计模式具体应用-(发布订阅者模式)
废话不多说,直接上代码//观察者模式public class Subject{ List<Observer> list = new ArrayList<>(); //存放订阅者 private String message = "订阅消息通知"; public void addObserver(Observer observer){ list.add(observer); } public void de原创 2021-10-19 10:21:33 · 148 阅读 · 0 评论 -
java设计模式具体应用-(责任链模式)
废话不多说,直接上代码public void contextLoads() throws Exception { ProjectAudit projectAudit = new ProjectAudit(); //创建链表 FinanceAudit financeAudit = new FinanceAudit(); BossAudit bossAudit = new BossAudit(); projectAudit.setSuccessor(financeAudi原创 2021-10-19 10:19:55 · 104 阅读 · 0 评论 -
java设计模式具体应用-(策略模式)
废话不多说,直接上代码 public void contextLoads() throws Exception { String type = "bossAudit"; AuditStrategy obj = null; ProjectAudit projectAudit = new ProjectAudit(); FinanceAudit financeAudit = new FinanceAudit(); BossAudi原创 2021-10-19 10:18:27 · 117 阅读 · 0 评论 -
虚拟机类加载机制
一个类从被加载到虚拟机内存中,到卸载,生命周期包含7个阶段:加载(Loading), 验证(Verification), 准备(Preparation), 解析(Resolution), 初始化(Initialization), 使用(Using), 卸载(Unloading)...原创 2021-08-20 17:25:23 · 72 阅读 · 0 评论 -
系统设计之如何选择存储系统
缓存如果数据访问频率很高,且场景需要低延迟,可以考虑采用缓存。常用的缓存有Memcached, Hazelcast, Redis, etc. 通常都采用Redis。文件存储比如需要上传图片、音视频资料,数据库存储就不太适用。我们需要采用Blob存储系统, 比如亚马逊 S3就是典型的blob存储。同时,可以配合适用CDN。CDN利用不同区域分布式存储数据,用户根据就近原则获取数据,可以确保低延迟。提供文本搜索功能的存储系统普通的数据库不能提供文本搜索功能,这种场景我们需要采用Elasti..原创 2021-08-20 10:48:04 · 131 阅读 · 0 评论 -
如何设计Twitter的系统(系统设计)
第一步:确定需求先确定功能性的需求点发布twitter转发twitter关注他人搜索功能其次是非功能性的需求高频率的读操作,twitter的读写比很高(相比写操作,读操作的频率非常高),设计模式需要围绕这点进行相关设计快速渲染快速发布twitter可接受一定的延迟,注意这里的延迟是指可以允许获取关注人的动态数据的延迟,不是页面渲染的延迟高并发,twitter每天平均每秒会发布5k左右的twitter, 加上高频率的读取,并发量成倍增加,系统拥有很高的QPS(Query per s原创 2021-08-10 14:05:00 · 761 阅读 · 0 评论 -
消息队列如何保证消息不丢失
这里我们以RocketMQ为例子,其他消息队列的原理基本上差不多。首先确定在消息的传输过程中,会在三个阶段出现丢失数据的情况:生产者没有成功发送消息RocketMQ没有成功持久化消息消费者没有成功消费消息对应的解决办法也非常地简单,和TCP的三次握手很类似:事务机制/confirm机制:生产者开启事务,只有当RocketMQ成功收到消息了,生产者才关闭事务,但是这个方法会阻塞;confirm机制相对有优势,它属于异步操作,当生产者发送完消息后,不需要一直等待,RocketMQ接收后会通原创 2021-08-08 19:40:48 · 635 阅读 · 0 评论 -
什么是微服务?(简单易懂)
提起微服务,肯定要了解一下微服务的发展历史,也就是为什么会演变出微服务这种架构。传统的架构mvc:1. 随着系统容量的扩大,维护和开发成本都非常高,比如改动某个功能模块,都需要整个服务重新部署;2. 多个开发人员分别开发不同的功能模块,协同开发比较容易受影响3. 分布式存储之后,改动一处,其他服务器上的代码也要跟着改动随后提出了RPC架构,按照不同子功能进行拆分成多个独立的项目进行部署,项目间通过RPC进行通信随后继续提出SOA, 知道最近提出的微服务架构,具体发展路径如图微服务基本架构:原创 2021-08-08 17:29:19 · 237 阅读 · 0 评论 -
Netty线程模型(图解秒懂)
Netty是基于异步的事件驱动的网络框架和工具,常见的分布式中间件底层都有涉及到Netty。Netty基本组件:Channel、Bootstrap 、EventLoop、ChannelPipeline、ChannelHandler、FutureNetty的线程模型为三种:单Reactor单线程,单Reactor多线程、主从Reactor多线程Reactor的作用相当于一个分发器,可以分发连接请求和处理IO请求;相当于一个饭店的服务员,是可以异步非阻塞地进行工作这里的线程一般指的是处理IO请求的线程数原创 2021-08-08 08:42:15 · 1989 阅读 · 0 评论 -
BIO、NIO、AIO
BIO: blocking IO, 同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。这里假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式就是, 叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。NIO: blocking IO, 同步非阻塞I/O模式,NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作AIO: blocking IO, 异步非阻塞I/O模式,无原创 2021-07-30 16:09:01 · 113 阅读 · 0 评论 -
同步、异步、阻塞、非阻塞(迄今为止最好的解释)
老张爱喝茶,废话不说,煮开水。出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。1 老张把水壶放到火上,立等水开。(同步阻塞)老张觉得自己有点傻2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。3 老张把响水壶放到火上,立等水开。(异步阻塞)老张觉得这样傻等意义不大4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(原创 2021-07-30 16:01:22 · 85 阅读 · 0 评论 -
多线程中锁的种类
锁的种类:可重入锁:已经获取锁的线程,可重复获取对象内其他锁中断锁:线程A在等待线程B释放锁的过程中,可以自主选择中断公平锁:按照锁请求的顺序获取锁读写锁:控制线程间读操作锁的优化:6. 自旋锁:不断循环尝试7. 锁清除:如果不存在竞争,清除锁8. 锁粗化:频繁加锁和释放锁的操作,可以扩大锁的范围9. 偏向锁10. 轻量级锁11. 重量级锁...原创 2021-07-28 11:33:53 · 301 阅读 · 0 评论 -
线程池(看图秒懂)
线程池的优势:(1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。(2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。(3)提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。线程池使用的关键参数:corePoolSize(必需):核心线程数。默认情况下,核心线程会一直存活,但是当将 allowCoreThreadTimeout,设置为 true 时,核心线程也会超时原创 2021-07-27 23:39:06 · 245 阅读 · 0 评论 -
微软算法面试题(2021最新)
今天,约了微软的面试,连续三轮,每轮1个小时,从下午2点持续到下午5点。虽然感觉自己最后一轮回答的非常烂,但是还是把面试过程分享出来,给大家一些参考吧第一轮:自我介绍+项目介绍开始做题: 合并k个链表解题思路:两两合并(考查分治方法)第二轮:自我介绍+项目介绍开始做题: 1. 如何判断一颗平衡树 2. 颜色分类(0,1,2按序排列)题1解题思路:采用递归,判断子树是否是一颗平衡树(如果是,返回子树高度;如果不是返回-1)题2解题思路:LeetCode原题,采用双指针第三轮:自我介绍+项目介原创 2021-07-27 20:54:53 · 2993 阅读 · 0 评论 -
红黑树(图解秒懂)
红黑树是一种含有红黑结点并能自平衡的二叉查找树,红黑树的特点:1:每个节点要么是黑色,要么是红色。2:根节点是黑色。3:每个叶子节点(NIL)是黑色。4:每个红色结点的两个子结点一定都是黑色。5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。自平衡的手段:1:左旋2:右旋3:变色查找操作同BST普通搜索二叉树;插入操作共有8种插入操作;...原创 2021-07-26 15:36:25 · 175 阅读 · 1 评论 -
wait和sleep区别(秒懂系列)
sleep(休眠) 和 wait(等待) 方法是 Java 多线程中常用的两个方法sleep是Thread类的静态方法,wait是Object类的方法;sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行;. 任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者sleep不释放锁,wait当前线程释放锁,等Object.notify()后重新获取锁sleep结束原创 2021-07-26 12:43:37 · 135 阅读 · 0 评论 -
JAVA异常分类以及处理机制(秒懂系列)
异常分类 Throwable是Java语言中所有错误或异常的超类,下一层分为Error和Exception:Error:Java运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如果出现这样的错误,除了告知用户,剩下的就是尽力使程序安全地终止。Exception:该异常是程序本身可以处理的异常,异常和错误的区别是,异常是可以被处理的,而错误是没法处理的。Exception又有两个分支,一个是运行时异常RuntimeException, 一 个 是编译异常 CheckedException。原创 2021-07-22 17:35:09 · 173 阅读 · 0 评论 -
LinkedHashMap实现原理(图解秒懂)
LinkedHashMap:在HashMap的基础上,具备顺序存储的功能。底层实现是hashMap+双向列表的组合,具体如下图:原创 2021-07-22 16:59:58 · 1006 阅读 · 0 评论 -
final finally finalize(总结到位)
final: 用于声明属性,方法和类, 分别表示属性不可变, 方法不可覆盖, 类不可继承.finally: 是异常处理语句结构的一部分,表示总是执行.finalize: 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等. JVM不保证此方法总被调用....原创 2021-07-21 06:20:33 · 49 阅读 · 0 评论 -
spring事务传播(图解秒懂)
事务传播等级说明PROPAGATION_REQUIRED当前方法必须在一个具有事务的上下文中运行,如有客户端有事务在进行,那么被调用端将在该事务中运行,否则的话重新开启一个事务PROPAGATION_SUPPORTS当前方法不必需要具有一个事务上下文,但是如果有一个事务的话,它也可以在这个事务中运行PROPAGATION_MANDATORY当前方法必须在一个事务中运行,如果没有事务,将抛出异常PROPAGATION_REQUIRES_NEW当前方法必须运行在它自...原创 2021-07-21 00:03:34 · 244 阅读 · 0 评论 -
JDK 1.7和JDK1.8区别(看图秒懂)
能说出三四条就可以了,注重理解,可解和hashMap的知识一起看~StreamApi: jdk1.8增加了stream特性,主要是基于fork-join框架构建,而且你可以通过parallel()与sequential()在并行流与顺序流之间进行切换。Hashmap性能优化:a. 1.7是数组+链表,1.8则是数组+链表+红黑树结构;b. 1.8尾插法,1.7中是采用头插hashCode值计算:a. jdk1.7直接使用key的hashCode值b. 1.8中则是采用key的h.原创 2021-07-20 15:16:38 · 1630 阅读 · 0 评论