
Java面试你要知道这些
有关Java面试需要知道的常识
全菜工程师小辉
微信公众号:全菜工程师小辉。欢迎关注~
展开
-
自定义注解+拦截器优化项目代码
自定义注解+拦截器的优势类似用户权限或者接口限流的需求,但并不是所有操作或者接口需要。可以使用过滤器或者拦截器,但这样就必须在配置文件里加上所有方法或者使用通配符。所以可以采用一种比较简单灵活的方式:采用自定义注解加Spring拦截器来实现。编写示例例如我们现在要做个接口的计数器限流,只需要像下面这样,加上一个注解即可。定义为每seconds秒内,最大访问量maxCount。@Acces...原创 2019-06-11 13:46:59 · 5555 阅读 · 0 评论 -
有关Spring事务,看这一篇就足够了
本文将按照声明式事务的五个特性进行介绍:事务传播机制事务隔离机制只读事务超时回滚规则Spring事务传播机制事务的特性原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在...原创 2019-06-11 08:10:15 · 6151 阅读 · 0 评论 -
Java多线程之原子操作类
本文目录:文章目录CAS原理与问题CAS的操作过程CAS的问题Atomic包的使用原子更新基本类型LongAdder原子更新数组类型原子更新引用类型原子更新字段类型解决CAS的ABA问题AtomicStampedReference踩过的坑在并发编程中很容易出现并发安全问题,最简单的例子就是多线程更新变量i=1,多个线程执行i++操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过Sy...原创 2019-06-03 22:11:29 · 5896 阅读 · 0 评论 -
SpringIoC和SpringMVC的快速入门
Spring的优势?降低了组件之间的耦合性 ,实现了软件各层之间的解耦可以使用容易提供的众多服务,如事务管理,消息服务等容器提供单例模式支持容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能Spring的IoC机制降低了业务对象替换的复杂性容器提供了众多的辅助类,能加快应用的开发Spring对于主流的应用框架提供了集成支持,如Hibernate,JPA,Mybati...原创 2019-05-12 21:05:01 · 5940 阅读 · 0 评论 -
JDK8函数式编程快速入门干货
Java8引入函数式编程,极大地提高了编码效率,对于习惯了原有Java代码风格的coder,确实需要好好熟悉一番才能熟练地coding。本文每一条讲解都配置了最简短的代码,适合快速入门或者字典使用,但阅读之后还是需要多看函数原型多看源码,灵活使用为好。本文目录:文章目录函数式编程语法常见的Java函数式接口ConsumerSupplierFunctionPredicateBinaryOper...原创 2019-05-03 06:33:27 · 6038 阅读 · 0 评论 -
Java秒杀系统优化的工程要点
这篇博客是笔者学习慕课网若鱼老师的《Java秒杀系统方案优化 高性能高并发实战》课程的学习笔记。若鱼老师授课循循善诱,讲解由浅入深,欢迎大家支持。本文记录课程中的注意点,方便以后code review。此外,本文将注意点相关的优质讲解链接在了一起,方便初学者系统学习。本文并非单纯介绍秒杀系统特有的技术点,不适合高手。进阶学习的话,极客时间有个不错的小专栏——如何设计一个秒杀系统,阿里高级技术...原创 2019-06-11 21:24:52 · 8068 阅读 · 0 评论 -
手写RPC框架指北另送贴心注释代码一套
Angular8正式发布了,Java13再过几个月也要发布了,技术迭代这么快,框架的复杂度越来越大,但是原理是基本不变的。所以沉下心看清代码本质很重要,这次给大家带来的是手写RPC框架。完整代码以及说明文档,点我跳跃~1. 什么是RPC?RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要...原创 2019-06-02 23:37:35 · 5588 阅读 · 0 评论 -
关于三次握手与四次挥手你要知道这些
TCP的整个连接过程如果没有基础的话,直接看这张图或者网络上各种文字描述,十分生涩,所以先看懂接下来的握手挥手的图,理解之后,再看这个有限状态机就感觉原来如此简单。三次握手握手过程第一次握手:主机A发送位码为syn=1,随机产生seq number=x的数据包到服务器,客户端进入SYN_SEND状态,等待服务器的确认;主机B由SYN=1知道A要求建立连接。第二次握手:主机B收到请...原创 2019-05-31 21:55:48 · 5657 阅读 · 0 评论 -
你该用HTTP2了
HTTP版本简史HTTP/0.9:(1991年)基于GET请求的文本传输协议HTTPS:(1994年)安全的HTTP传输协议HTTP/1.0:(1996年)增加HTTP头、扩展PUT、POST等方法HTTP/1.1:(1999年)长连接、流水线支持,最广泛使用的HTTP传输协议SPDY:(2012年)针对HTTP的增强,工作在SSL层之上、HTTP层之下HTTP/2:(2...原创 2019-05-29 23:08:06 · 5557 阅读 · 0 评论 -
快速了解TCP的流量控制与拥塞控制
有关TCP你不能不知道的三次握手和四次挥手问题,点我跳转流量控制1. 滑动窗口数据的传送过程中很可能出现接收方来不及接收的情况,这时就需要对发送方进行控制以免数据丢失。利用滑动窗口机制可以很方便地在TCP连接上对发送方的流量进行控制。TCP的窗口单位是字节,不是报文段,发送方的发送窗口不能超过接收方给出的接收窗口的数值。TCP规定,即使设置为零窗口,也必须接收以下几种报文段:零窗...原创 2019-06-01 21:01:02 · 5656 阅读 · 0 评论 -
还在用Executors创建线程池?小心内存溢出
线程池不建议使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。Executors各个方法的弊端:newFixedThreadPool和newSingleThreadExecutor:主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。(笔者注:阻塞队列均采用LinkedBloc...原创 2019-05-28 22:06:56 · 8843 阅读 · 0 评论 -
session一致性的解决方案
什么是session?服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文,这个相关信息就是session。这样,当用户在应用程序的Web页之间跳转时,存储在session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。session是对http无状态协议的补充,达到状态保持的目的什么是session一致性问题?假设用户包含登录信息的sessio...原创 2019-05-22 07:57:58 · 5892 阅读 · 0 评论 -
快速了解会话管理三剑客cookie、session和JWT
存储位置三者都是应用在web中对http无状态协议的补充,达到状态保持的目的cookie:cookie中的信息是以键值对的形式储存在浏览器中,而且在浏览器中可以直接看到数据。下图为safari的cookie截图:session:session存储在服务器中,然后发送一个cookie存储在浏览器中,cookie中存储的是session_id,之后每次请求服务器通过session_id可以获取...原创 2019-05-21 22:31:58 · 5623 阅读 · 0 评论 -
Spring与后端模板引擎的故事
现在很多开发,都采用了前后端完全分离的模式,随着近几年前端工程化工具和MVC框架的完善,使得这种模式的维护成本逐渐降低。但是这种模式目前并不利于SEO(前后端分离的SEO问题会慢慢改善),而且某些场景使用模板引擎会更方便,比如说邮件模板以及数据变化不频繁的后台系统。Spring,确切来说是Spring MVC除了可以实现RESTful web服务之外,还可以使用它提供动态HTML内容。Sprin...原创 2019-05-18 10:51:11 · 5576 阅读 · 0 评论 -
剑指offer最优解Java版源码索引
《剑指Offer》剖析了50个典型的程序员面试题,从基础知识、代码质量、解题思路、优化效率和综合能力五个方面系统整理了影响面试的5个要点。是一本计算机大学生算法提高必备的一本书。笔者经过1年的PHP和Java混合开发的项目后,略感Java功力受损,所以准备花几天空闲时间,按照牛客网的题目顺序,将所有题目使用Java实现一遍,每道题ac之后,都参考下评论中的各个答案,取长补短,整理出Java版本的...原创 2019-07-14 22:09:34 · 5929 阅读 · 1 评论 -
动态规划快速入门
动态规划算法一直是面试手撕算法中比较有挑战的一种类型。很多的分配问题或者调度问题实际上都可能用动态规划进行解决。(当然,如果问题的规模较大,有时候会抽象模型使用动归来解决,有时候则可以通过不断迭代的概率算法解决查找次优解)所以,动归很重要,至少算法思想很重要。文章目录什么是动态规划?分治与动态规划动态规划的步骤问题建模问题求解的各个方法暴力枚举:递归:备忘录算法:动态规划算法:例题什么是动态...原创 2019-05-19 16:07:56 · 6121 阅读 · 0 评论 -
浅析数据库与缓存的双写一致性问题
缓存由于其高并发和高性能的特性,在项目中被广泛使用。读缓存流程如下图:双写一致性有以下三个要求:缓存不能读到脏数据缓存可能会读到过期数据,但要在可容忍时间内实现最终一致这个可容忍时间尽可能的小要想同时满足上面三条,可以采用读请求和写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不一致的情况。但是,串行化之后,就会导致系统的吞吐量会大幅度的降低,要用比正常情况下多几倍的...原创 2019-06-10 22:21:16 · 6341 阅读 · 0 评论 -
Redis的高级特性一览
应用场景:缓存系统:用于缓解数据库的高并发压力计数器:使用Redis原子操作,用于社交网络的转发数,评论数,粉丝数,关注数等排行榜:使用zset数据结构,进行排行榜计算实时系统:使用Redis位图的功能实现布隆过滤器,进而实现垃圾邮件处理系统消息队列:使用list数据结构,消息发布者push数据,多个消息订阅者通过阻塞线程pop数据,以此提供简单的消息队列能力之所以说简单,是Re...原创 2019-05-25 19:27:48 · 5603 阅读 · 0 评论 -
Redis持久化的原理及优化
Redis提供了将数据定期自动持久化至硬盘的能力,包括RDB和AOF两种方案,两种方案分别有其长处和短板,可以配合起来同时运行,确保数据的稳定性。RDB保存数据快照至一个RDB文件中,用于持久化。RDB操作和Mysql Dump相似。执行方式save。同步操作,会阻塞Redis。bgsave。调用linux的fork(),然后使用新的线程执行复制。但是fork期间也会阻塞Redis,但...原创 2019-05-26 09:00:56 · 5535 阅读 · 0 评论 -
快速了解Https
HTTPS简介HTTPS:https是http与ssl的结合,为了解决http明文传输导致信息泄露的问题。ssl通过公钥和私钥保证客户端和服务器之间的通讯加密,由权威机构办法的数字证书杜绝了中间人攻击的可能。默认端口为443。SSL需要到ca申请证书,一般免费证书较少,因而需要一定费用。(笔者一直用阿里云,有个免费ssl申请,还是挺适合个人使用的。据说其他云商也有免费ssl)有关...原创 2019-06-22 08:00:00 · 6292 阅读 · 0 评论 -
Spring的设计模式快速入门干货
设计模式是一套被反复使用的、多数人知晓的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式的分类1.创建型模式对象的创建会消耗掉系统的很多资源,所以对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题。这里有6个具体的创建型模式可供研究,它们分别是: 简单工厂模式(Simple Factory) 工厂方法...原创 2019-06-21 08:00:00 · 6011 阅读 · 0 评论 -
Java多线程的可见性与有序性
多线程的可见性一个线程对共享变量值的修改,能够及时的被其他线程看到。共享变量如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。Java内存模型JMM(Java Memory Model,简称JMM)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层细节。它遵循四个原则: 所...原创 2019-06-19 08:00:00 · 6350 阅读 · 0 评论 -
Java异常处理扫盲贴
Throwable类是Java语言所有错误或异常的超类(两个直接子类:Error和Exception)Error vs ExceptionJava程序在执行过程中所发生的异常事件可分为两类:Error:Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。例如,Java虚拟机运行错误(Virtual MachineError),当JVM不再有继续执行操...原创 2019-06-18 08:00:00 · 5941 阅读 · 0 评论 -
快速了解Java线程池
之所以要使用线程池,是因为使用new Thread在大型项目中是有弊端的: 每次new Thread新建对象,性能差 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能会造成过多占用系统资源而导致OOM 缺少更多功能,如定期执行等 而线程池的好处: 重用存在的线程,减少对象创建、消亡的开销,性能佳 可有效控制最大并发线程数,提高系统资源利用率,同...原创 2019-06-17 08:00:00 · 5961 阅读 · 0 评论 -
有关JIT你需要知道的
JVM对代码执行的优化可分为运行时(runtime)优化和即时编译器(JIT)优化。运行时优化主要是解释执行和动态编译通用的一些机制。比如说锁机制(如偏斜锁)、内存分配机制(如TLAB)等。除此之外,还有一些专门用于优化解释执行效率的,比如说模版解释器、内联缓存(inline cache,用于优化虚方法调用的动态绑定)什么是 JIT?在部分的商用虚拟机(Sun HotSpot、IBM J...原创 2019-06-16 08:00:00 · 6819 阅读 · 0 评论 -
一网打尽Java中锁的分类
来一段很常见的死锁代码,当个开胃菜:class Deadlock { public static String str1 = "str1"; public static String str2 = "str2"; public static void main(String[] args) { Thread thread1 = n...原创 2019-06-15 08:00:00 · 6124 阅读 · 0 评论 -
Redis主从复制的原理
在Redis集群中,让若干个Redis服务器去复制另一个Redis服务器,我们定义被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),这种模式叫做主从复制模式。数据流向是单向的,只能是从master到slave一个slave只能有一个master主从复制的作用 为数据提供多个副本,实现高可用 实现读写分离(主节点...原创 2019-05-28 08:00:00 · 6109 阅读 · 1 评论 -
快速了解UDP协议
互联网工程任务组(IETF)官员透露,HTTP-over-QUIC实验协议将重命名为HTTP/3,并有望成为HTTP协议的第三个正式版本。Quic(QuickUDP Internet Connections)是一种新的传输方式,与TCP相比,它减少了延迟。表面上,Quic非常类似于在UDP上实现的TCP+TLS+HTTP/2。由于TCP是在操作系统内核和中间件固件中实现的,因此对TCP进行重大...原创 2019-06-23 08:00:00 · 6138 阅读 · 0 评论 -
图解一致性hash算法和实现
一致性hash算法是什么?一致性hash算法,是麻省理工学院1997年提出的一种算法,目前主要应用于分布式缓存当中。一致性hash算法可以有效地解决分布式存储结构下动态增加和删除节点所带来的问题。在Memcached、Key-Value Store、Bittorrent DHT、LVS中都采用了一致性hash算法,可以说一致性hash算法是分布式系统负载均衡的首选算法。传统hash算法的弊...原创 2019-05-18 18:35:13 · 6179 阅读 · 0 评论 -
explain的属性详解与提速百倍的优化示例
在MySQL中,可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。EXPLAIN命令虽然没有提供任何优化建议,但它能够提供重要的信息有助于调优决策。EXPLAIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。使用方法在要查询的SQL语句前加上explain,然后执行...原创 2019-08-19 08:00:00 · 2666 阅读 · 1 评论 -
彻底搞懂MySQL的索引
前言MyISAM和InnoDB是MySQL最常用的两个存储引擎,本文将进行详尽的介绍和对比。对于MySQL其余几种存储引擎,请读者自行搜索学习。本文会图解两种引擎的索引结构区别,然后讲解索引的原理,理解本文内容,就能够理解索引优化的各种原则的背后原因。限于篇幅,本篇没有介绍的知识,会在后续博客将逐一讲解。例如:MySQL引擎的锁机制、多列索引的生效规则、索引优化等主题。下面SQL在...原创 2019-08-12 08:00:00 · 3127 阅读 · 1 评论 -
彻底搞懂java程序的初始化顺序
使用场景在java程序中,当实例化对象时,对象的所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。原则 变量优先于块、静态优先于非静态。 父类优先于派生类初始化。 按照成员变量定义的顺序来进行初始化,即使变量定义散布于方法定义之中,它们仍然在任何方法(包括构造器)被调用前初始化。 初始化顺序父类...原创 2019-08-09 08:00:00 · 3042 阅读 · 0 评论 -
安全发布对象-发布与逸出
发布对象简单来说就是提供一个对象的引用给作用域之外的代码。比如return一个对象,或者作为参数传递到其他类的方法中。不安全的发布对象示例:@Slf4j @NotThreadSafe public class UnsafePublish { private String[] states = {"a", "b", "c"}; public S...原创 2019-06-29 08:00:00 · 5985 阅读 · 0 评论 -
Java类加载及对象创建过程详解
类加载过程类加载的五个过程:加载、验证、准备、解析、初始化。加载在加载阶段,虚拟机主要完成三件事: 通过一个类的全限定名来获取定义此类的二进制字节流。 将这个字节流所代表的静态存储结构转化为方法区域的运行时数据结构。 在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区域数据的访问入口。 验证验证阶段作用是保证Class...原创 2019-06-27 08:00:00 · 10600 阅读 · 2 评论 -
TCP粘拆包详解与Netty代码示例
TCP是个“流”协议,所谓流,就是没有界限的一串数据。可以想想河里的流水,是连成一片的,其间并没有分界线。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。有关TCP的详细讲解,可以点击查看这一篇和另外一篇...原创 2019-06-28 08:00:00 · 6386 阅读 · 0 评论 -
JVM内存模型和垃圾回收机制
JVM内存模型根据Java虚拟机规范,Java数据区域分为五大数据区域。其中方法区和堆是所有线程共享的,虚拟机栈、本地方法栈和程序计数器则为线程私有的。有的博客称方法区是永久代,那是因为前者是JVM的规范,而后者则是JVM规范的一种实现,并且只有HotSpot才有永久代,JDK8中已经彻底移除了方法区,JDK8中引入了一个新的内存区域叫metaspace(元空间),后边详细介绍...原创 2019-06-26 08:00:00 · 7074 阅读 · 0 评论 -
快速理解设计模式之创建型模式
要想更全面理解设计模式,建议先查看Spring的设计模式快速入门干货,前半部分是设计模式的分类和综述,与Spring无关。创建型模式对象的创建会消耗掉系统的很多资源,所以对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题。这里有6个具体的创建型模式可供研究,它们分别是: 简单工厂模式(Simple Factory) 工厂方法模式(Factory Meth...原创 2019-06-25 08:00:00 · 6112 阅读 · 0 评论 -
彻底搞懂Java的等待-通知(wait-notify)机制
线程的生命周期转换 新建状态(New):新建一个线程对象。 就绪/可运行状态(Runnable):线程对象创建后,其他线程调用了该对象的start方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。 运行状态(Running):就绪状态的线程获得CPU并执行程序代码。 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用...原创 2019-08-06 08:00:00 · 12846 阅读 · 6 评论 -
彻底搞懂Netty高性能之零拷贝
作为Java网络编程学习者,不仅要知道NIO,还一定要学习Mina和Netty这两个优秀的网络框架。作为上一篇NIO效率高的原理之零拷贝与直接内存映射的补充,本文将针对Netty的零拷贝特性进行详细分析。Netty高性能的原因Netty作为异步事件驱动的网络框架,高性能主要来自于其I/O模型和线程处理模型,前者决定如何收发数据,后者决定如何处理数据。Netty高性能的原因总结,智者见智...原创 2019-08-01 08:00:00 · 5640 阅读 · 0 评论 -
Redis的过期键删除策略和数据逐出策略
Redis作为一个高性能的内存NoSQL数据库,其容量受到最大内存限制的限制。在实际生产环境中使用Redis时,偶然会觉得Redis的内存占用要比自己预想的大。事实上,Redis占用的内存除了保存键值对所需的开销外,还有一些运行时产生的额外内存,包括: 过期Key所占空间 渐进式Rehash导致未及时删除的空间 Redis管理数据,包括底层数据结构开销,客户端信息,读...原创 2019-07-25 08:00:00 · 5507 阅读 · 1 评论