自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 2020已过半,开始备战下半年秋招,分享蚂蚁Java岗面试题80+

前言也许会有人感叹某些人的运气比较好,但是他们不曾知道对方吃过多少苦,受过多少委屈。某些时候就是需要我们用心去发现突破点,然后顺势而上,抓住机遇,那么你将会走向另外一条大道,成就另外一个全新的自我。就目前大环境来看,面试的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验Java程序员的技术功底。Java1.多个线程同时读写,读线程的数量远远⼤于写线程,你认为应该如何解决并发的问题?你会选择加什么样的锁?2.JAVA的AQS是否了解,它是⼲嘛的?3.除了synchroni

2020-06-30 22:33:09 265

转载 SQL 查询总是先执行SELECT语句吗?你们都错了!

前言很多 SQL 查询都是以 SELECT 开始的。不过,最近我跟别人解释什么是窗口函数,我在网上搜索”是否可以对窗口函数返回的结果进行过滤“这个问题,得出的结论是”窗口函数必须在 WHERE 和 GROUP BY 之后,所以不能”。于是我又想到了另一个问题:SQL 查询的执行顺序是怎样的?好像这个问题应该很好回答,毕竟自己已经写了上万个 SQL 查询了,有一些还很复杂。但事实是,我仍然很难确切地说出它的顺序是怎样的。SQL 查询的执行顺序于是我研究了一下,发现顺序大概是这样的。SELECT 并不

2020-06-30 21:45:40 131

原创 你知道为什么大多数SpringBoot开发者更喜欢Undertow,而不是Tomcat吗?

前言在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。同时,SpringBoot也支持Undertow容器,我们可以很方便的用Undertow替换Tomcat,而Undertow的性能和内存使用方面都优于Tomcat,那我们如何使用Undertow技术呢?本文将为大家细细讲解。SpringBoot中的Tomcat容器SpringBoot可以说是目前最火的Java Web框架了。它将开发者从繁重的xml解救了出来,让开发者在

2020-06-30 21:33:50 354

原创 阿里面试官:分别说说微信和淘宝扫码登录背后的实现原理?

1、引言扫码登录这个功能,最早应该是微信的PC端开始搞,虽然有点反人类的功能(不扫码也没别的方式登录),但不得不说还是很酷的。下面这张图,不管是IM开发者还是普通用户,应该很熟悉:于是,搞IM产品的老板和产品经理们,从此又多了一个要抛给程序员们的需求——“为什么微信有扫一扫登录,而我们的没有?”。好吧,每次只要是微信有的功能,IM程序员们想甩锅,难度就有点大了,毕竟老板们都都会想当然认为,微信有的“我”的IM产品里也得有。既然无法回避,那就只能老老实实搞懂技术原理,然后自已使劲撸吧。本文将简要

2020-06-30 21:22:57 179

原创 二本本科生,十面阿里路

前言1.项目方面参考意义不大,所有问题均未涉及2.笔者技术水平有限,可能面试难度较低,如果对您没有帮助,请见谅3.2次HR面就不放了,看到大家的面经都没谈到HR面,担心写出来可能会承担不必要的风险。4.感谢 CBU 和 CRO 的所有面试官, 特别是CBU一面的小姐姐, 在我尚未经历几次面试的时候给了我特别多后续准备和发展的建议, 也感谢两位内推人的积极跟进~CBU一面2.20(46min)1.项目相关介绍,没太大参考性就不写了~2.String 为什么不可变, 处于什么考虑3.Strin

2020-06-29 22:51:50 144

原创 Java开发三年,竟然连动态注册bean都不知道?

干货点:看完该篇文章我们可以了解到为何要动态注册bean、动态注册bean的方式、注册和实例化的区别、spring是什么时候实例化bean的。描述:前阵子在给项目写组件的时候研究了下spring组件拓展流程,其中遇见了动态注册bean的操作,对于长期使用spring容器管理bean的同学来说动态注册bean应该是活久见系列,为此打算以组件中使用到的方式讲讲动态注册方面的相关解说。应用场景在自定义组件的时候,需要自定义命名空间注册器,其中需要提供一个配置解析器ConfigDefinitionPars

2020-06-29 22:17:08 284

原创 Java程序员3轮6小时面试,成功拿到百度offer

今天分享的是一位5年工作经验的Java工程师在帝都的面试经验总结,看看这些互联网公司都爱问些什么题,希望对大家的面试有指导意义。从事Java开发也有5年经验了,4月初自己的开启面试经历之旅,前后应该20天左右,主面互联网公司,一二线大公司或者是融资中的创业公司都面试过,也拿了几个offer,其中包括奇虎360、字节跳动等。首先不同面试官面试风格一定不同,这里是我总结这些天面试Java开发过程中的大多数问题,综合分类有Java基础,框架,多线程,网络通信,数据库以及设计模式,算法等几个模块。一名3年工

2020-06-29 21:59:26 1038

原创 HashMap面试题中的夺命二十一问!

1:HashMap 的数据结构?A:哈希表结构(链表散列:数组 + 链表)实现,结合数组和链表的优点。当链表长度超过 8 时,链表转换为红黑树。transient Node<K,V>\[\] table;2:HashMap 的工作原理?HashMap 底层是 hash 数组和单向链表实现,数组中的每个元素都是链表,由 Node 内部类(实现 Map.Entry 接口)实现,HashMap 通过 put & get 方法存储和获取。存储对象时,将 K/V 键值传给 put()

2020-06-29 21:17:21 265

原创 Spring面试题:打底50道,应该至少答对30个(附答案)

作为一个Java程序员,Spring没得商量,对我们是必须会的,而且很重要,几乎我们大多项目都用得它,作为一个优质且生态系统非常全面的框架,不仅在使用上很给力,源码也有很大的学习价值。小编给大家整理了50道面试题,或者说50个知识点,可以先收藏起来了????。1.Spring框架?Spring框架是由于软件开发的复杂性而创建的,Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事。从简单性、可测性和松耦合性角度而言,绝大部分Java应用都可以用Spring。2.Spring的整

2020-06-28 22:19:40 216

原创 十道泛型面试题,你答得上来吗?

问题一:为什么需要泛型?答:使用泛型机制编写的代码要比那些杂乱的使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性,也就是说使用泛型机制编写的代码可以被很多不同类型的对象所重用。问题二:从ArrayList的角度说一下为什么要用泛型?答:在Java增加泛型机制之前就已经有一个ArrayList类,这个ArrayList类的泛型概念是使用继承来实现的。public class ArrayList { private Object[] elementData;

2020-06-28 21:59:04 2105

原创 程序员的自我修养之线程与栈

这篇文章是介绍一下线程与栈相关的话题,文章比较长,主要会聊聊下面这些话题:进程与线程的本质区别,线程与内存共享Linux pthread 与 Guard 区域Hotspot 线程栈的 Guard 区域实现原理你可能没有怎么听说过的 Yellow-Zone、Red-ZoneJava StackOverflowError 的实现原理为了讲清楚线程与栈的关系,我们要从进程和线程之间的关系讲起,接下来开始第一部分。第一部分:老生常谈之进程线程网上很多文章都说,线程比较轻量级 lightweigh

2020-06-28 21:22:03 449

原创 JAVA线程池,看完这一篇再也不怕面试被问了

1.什么是线程池线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位,我们的程序最终都是由线程进行运作。在Java中,创建和销毁线程的动作是很消耗资源的,因此就出现了所谓“池化资源”技术。线程池是池化资源技术的一个应用,所谓线程池,顾名思义就是预先按某个规定创建若干个可执行线程放入一个容器中(线程池),需要使用的时候从线程池中去取,用完之后不销毁而是放回去,从而减少了线程创建和销毁的次数,达到节约资源的目的。2.为什么要使用线程池2.1 降低资源消耗前

2020-06-28 15:20:00 137

原创 聊聊数据库和缓存一致性的几种实现方式

缓存是互联网高并发系统里常用的组件,由于多增加了一层,如果没有正确的使用效果可能适得其反,诸如“缓存是删除还是更新?”,“先操作数据库还是先操作缓存?”都是些老生常谈的话题,今天我们就来聊一聊缓存与数据库的双写一致性的解决方案。Cache Aside Pattern在一开始先科普下最经典的缓存+数据库读写的模式,就是 Cache Aside Pattern。读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。更新的时候,先更新数据库,然后再删除缓存。为什么是删除

2020-06-28 14:42:59 213

原创 你知道跨域的原理与解决方法吗?

背景在最近的项目中,遇到这样一个场景:合作方开发H5页面并部署在合作方的服务器上,但页面中嵌入了我方的SDK,SDK会直接调用我方的接口,如下图:但是控制台中却会收到如下报错:Access to XMLHttpRequest at 'http://example1.com/test' from origin 'http://example2.com' has been blocked by CORS policy: Response to preflight request doesn't pass

2020-06-27 17:50:45 359

原创 教你用mysql做定时备份任务

简介在生产环境上,为了避免数据的丢失,通常情况下都会定时的对数据库进行备份。而Linux的crontab指令则可以帮助我们实现对数据库定时进行备份。首先我们来简单了解crontab指令,如果你会了请跳到下一个内容mysql备份。本文章的mysql数据库是安装在docker容器当中,以此为例进行讲解。没有安装到docker容器当中也可以参照参照。contab定时任务使用crontab -e来编写我们的定时任务。0 5 * * 1 [command]前面的5个数字分别代表分、时、日、月、周,后面的

2020-06-27 17:35:06 299 1

原创 Redis高可用系列中的持久化 AOF和RDB,你真的懂吗?

Redis高可用概述在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义。我们知道,在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999% 等等)。但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务(如主从分离、快速容灾技术),还需要考虑数据容量的扩展、数据安全不会丢失等。在Redis中,实现高可用的技术主要包括持久化、复制、哨兵和集群,下面分别说明它们的作用,以及解决了什么样的问

2020-06-24 16:58:09 143

原创 Java 线程不安全分析,同步锁和Lock机制,哪个解决方案更好

线程不安全线程不安全的问题分析:在小朋友抢气球的案例中模拟网络延迟来将问题暴露出来;示例代码如下:public class ImplementsDemo { public static void main(String []args) { Balloon balloon = new Balloon(); new Thread(balloon, "小红").start(); new Thread(balloon, "小强").start();

2020-06-24 16:32:02 275

原创 HashMap面试宝典

前言本文源码分析基于jdk1.8版本(持续更新中)1、HashMap数据结构与工作原理这是基础中的基础,这个都不能掌握,面试大概率要翻车。源码自己看,这里讲流程。在Jdk1.8中,HashMap数据结构是数组+链表+红黑树,数组也叫做hash表,每条链表也叫做桶(bucket),红黑树是为了提高查询效率。1、存放元素的时候会先根据key的hash值去计算元素下标,如果这个下标没有元素,就创建一个Node节点放进去;2、如果数组下标有数据,先判断key是否相同,相同的话替换元素的value;不同

2020-06-23 22:05:53 197

原创 一篇文章搞定 Nginx 限流配置

1、限流算法令牌桶算法令牌桶算法算法思想是:令牌以固定速率产生,并缓存到令牌桶中;令牌桶放满时,多余的令牌被丢弃;请求要消耗等比例的令牌才能被处理;令牌不够时,请求被缓存。漏桶算法漏桶算法算法思想是:水(请求)从上方倒入水桶,从水桶下方流出(被处理);来不及流出的水存在水桶中(缓冲),以固定速率流出;水桶满后水溢出(丢弃)。这个算法的核心是:缓存请求、匀速处理、多余的请求直接丢弃。相比漏桶算法,令牌桶算法不同之处在于它不但有一只“桶”,还有个队列,这个桶是用来存放令牌的,

2020-06-23 21:54:36 201

原创 JAVA多方法顺序锁

前言在开发项目期间,发现有多个方法同时操作数据库产生了数据脏读幻读的问题,然后就想要开发一个包,在不侵入原先代码逻辑的情况下,让方法进行顺序执行。使用说明这里我采用的是通过切面原先逻辑做前后处理,而不侵入原先的逻辑【使用步骤】一、由于考虑到可插拔性,以及代码路径的不一致,我们需要在启动类上面加上注解@EnableMultiLock,用以开启多方法锁二、然后在需要加锁的方法上面加上注解@MultiMethodLock,如下所示,给三个方法加上同名的锁,当test1在执行的时候test2和test3

2020-06-22 17:26:04 556

原创 为什么SpringBoot中Service实现类添加@Service会无法注入?

最近一直在研究Spring Boot。从GitHub上下载了一个my-Blog源码,一边看,一边自己尝试去实现,结果掉在坑了,研究了近一周才爬出来,特地来这博客园记录下来,一是避免自己在放这样的错误,二是希望看到的朋友能有所帮助,毕竟我在网上查了很多资料,答案基本上千篇一律,并不能解决我的问题。先说问题:我在Controller层中引用Service层的实现类,报错,错误代码如下:2020-06-21 22:49:45.094 ERROR 1552 --- [nio-8081-exec-6] o.a..

2020-06-22 17:15:18 3713 6

原创 讲一道java基础--什么是内部类?

内部类定义定义在另一个类内部的类创建内部类内部类是在一个类的内部嵌套定义的类,他可以是其他类的成员,也可以在一个语句块的内部定义,还可以是在表达式内部的匿名定义public class InnerClass { //内部类1 class Contents{ private int i = 11; public int value(){ return i; } } //内部类2 class

2020-06-20 21:48:30 131

原创 Redis缓存三大问题,你知道多少?

前言日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题。一旦涉及大数据量的需求,如一些商品抢购的情景,或者主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度问题有严重的性能弊端,详细的磁盘读写原理请参考这一片[]。在这一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。为了克

2020-06-20 21:36:27 425

原创 经过一顿骚操作,项目编译打包速度提升一倍!

背景我们的公司的系统中是以微服务方式开发的。每个项目就是一个微服务,有非常多的微服务,比如用户服务、后台管理服务、订单服务、物流服务、商品服务等等。其中每个项目都使用的 gradle 构建工具打包、发布、部署。gradle 是一个项目构建工具,与 maven 类似,它提供非常强大的包依赖管理功能。现象与问题1.有些项目打包编译速度非常慢,有时需要 5 到 10 分钟,而且还经常失败。2.有时候点击三方包的查看源码,通过 IDE 进入类的 class 文件,点击下载源码,控制台显示失败。3.项目

2020-06-19 22:07:50 922

原创 Java 中利用 redis 实现一个分布式锁服务

在现代的编程语言中,接触过多线程编程的程序员多多少少对锁有一定的了解。简单的说,多线程中的锁就是在多线程环境下,多个线程对共享资源进行修改的时候,保证共享资源一致性的机制。这里不展开说。在分布式环境下,原来的多线程的锁就不管用了,也就出现了分布式锁的需求。所谓分布式锁服务也就是在分布式环境下,保证多个分布式的服务共享的资源一致性的服务。在分布式环境下实现一个分布式锁服务并不太容易,需要考虑很多在单进程下的锁服务不需要考虑的问题。分布式锁锁的实现也有很多。这里我们讨论在 Java 中通过 redis 来实

2020-06-19 21:41:25 164

原创 定时器线程池(ScheduledThreadPoolExecutor)

前言定时器线程池提供了定时执行任务的能力,即可以延迟执行,可以周期性执行。但定时器线程池也还是线程池,最底层实现还是ThreadPoolExecutor,可以参考我的另外一篇文章多线程–精通ThreadPoolExecutor。特点说明1.构造函数 public ScheduledThreadPoolExecutor(int corePoolSize) { // 对于其他几个参数在ThreadPoolExecutor中都已经详细分析过了,所以这里,将不再展开 // 这里我们可以看到调用基类中的方

2020-06-17 10:39:44 338

原创 多线程--精通ThreadPoolExecutor

前言在多线程开发中,应该避免显式创建线程,而是采用线程池里面的线程。使用线程池可以减少手动创建线程,减少线程创建和回收的损耗等。那么使用线程池就需要了解它的原理。这里我们ThreadPoolExecutor.execute()方法内部的具体实现逻辑流程图源码分析 public void execute(Runnable command) { if (command == null) throw new NullPointerException();

2020-06-16 21:21:27 121

原创 Java线程池是如何实现线程复用的?

前言没看本文,面试挂了,别说没提醒你!没看本文,面试挂了,别说没提醒你!没看本文,面试挂了,别说没提醒你!相信很多人都接触过线程池,我们知道线程池有核心线程和非核心线程之分,其中核心线程是一直存活在线程池中的,而非核心线程是在执行完任务之后超时销毁的。但是大家应该都知道一点,当Thread执行完Runnable任务之后就会销毁,而且就算执行完任务之后把线程挂起也没有办法再去执行其他任务,那线程池是如何做到核心线程复用的呢?下面就通过阅读源码的方法带大家了解背后的原因。大家可以对着这个流程图去学习源

2020-06-16 21:16:40 2404 1

原创 想要替代 C 与 Java 的后浪们,现今如何?

近日,TIOBE 公布了 2020 年 5 月的编程语言排行榜,C 语言时隔 5 年重返榜首,Java 和 Python 分列二、三位。前段时间,B 站推出的青年节演讲视频《后浪》在朋友圈刷屏,看着“后浪”们丰富多彩的生活,同事们纷纷自嘲自己就是被拍在沙滩上的那一个,被生活疯狂蹂躏。然而在编程语言界,“后浪”们掀起的波澜则十分有限。与近年来陆续涌现的新兴编程语言相比,那些出道即巅峰、一巅几十年的“前浪”们,似乎还没有要退位让贤的意思。在 TIOBE 公布的最新编程语言排行榜中,排名前十的语言中有 .

2020-06-14 22:08:03 428

原创 什么是Spring? 什么是 Spring Boot ?

概述对于 Spring和 SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习 SpringBoot的我当时也是一头雾水,随着经验的积累、我慢慢理解了这两个框架到底有什么区别,相信对于用了 SpringBoot很久的同学来说,还不是很理解 SpringBoot到底和 Spring有什么区别,看完文章中的比较,或许你有了不同的答案和看法!什么是Spring作为 Java开发人员,大家都 Spring都不陌生,简而言之, Spring框架为开发 Java应用程序提供了全面的基础架构支持。它

2020-06-14 17:45:37 2856

原创 一个大量消耗JVM物理内存的Bug

概述最近我们公司在帮一个客户查一个JVM的问题(JDK1.8.0_191-b12),发现一个系统老是被OS Kill掉,是内存泄露导致的。在查的过程中,阴差阳错地发现了JVM另外的一个Bug。这个Bug可能会导致大量物理内存被使用,我们已经反馈给了社区,并得到快速反馈,预计在OpenJDK8最新版中发布(JDK11中也存在这个问题)。PS:用户的那个问题最终也解决了,定位下来算是C2的一个设计缺陷导致大量内存被使用,安全性上没有得到保障。找出消耗大内存的线程接下来主要分享下这个BUG的发现过程,先

2020-06-12 22:13:27 417

原创 Dubbo线程池你不得不会的知识

问题描述线上突然出现Dubbo超时调用,时间刚好为Consumer端设置的超时时间。有好几个不同的接口都报超时了第1次调用超时,第2次(或第3次)重试调用非常快(正常水平)Dubbo调用超时的情况集中出现了3次,每次都是过一会自动恢复排查排查日志看到调用超时,首先就拿着traceId去服务提供方查日志。 奇怪的是,在服务提供方的业务日志里面,只有正常的调用日志(耗时正常),没有超时调用的日志。 从正常的调用日志里面看,一切都是正常的,看不出所以然。 给人的感觉就是超时那次请求的调用没有达到服务

2020-06-12 22:00:44 468

原创 Spring Boot 中跨域问题的三个场景

Spring Boot 中的跨域问题主要分为三个场景:普通跨域Spring Security 跨域OAuth2 跨域分为三种并非多此一举,主要是因为这三种场景的配置都不太一样,而这三种场景又都是非常常见的场景,所以这里和大家再来专门分享下。1.什么是跨域很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的,说到跨域,就不得不说说浏览器的同源策略。同源策略是由 Netscape 提出的一个著名的安全策略,它是浏览器最核心也最基本的安全功能,现在所有支持 JavaScript

2020-06-11 22:23:06 131

原创 Netty这几大核心知识你会吗?大数据、分布式都要用到它

1. Netty 基础Netty 是一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。它是一个网路应用框架。2. Netty 高性能之道2.1. RPC 调用的性能模型分析2.1.1. 传统 RPC 调用性能差的三宗罪网络传输方式问题:传统的 RPC 框架或者基于 RMI 等方式的

2020-06-11 16:19:13 155

原创 优秀的Spring 组件是怎样写成的?

背景Spring 框架提供了许多接口,可以使用这些接口来定制化 bean ,而非简单的 getter/setter 或者构造器注入。细翻 Spring Cloud Netflix、Spring Cloud Alibaba 等这些构建在 Spring Framework 的成熟框架源码,你会发现大量的扩展 bean 例如Eureka 健康检查package org.springframework.cloud.netflix.eureka;public class EurekaHealthCheck.

2020-06-10 20:11:11 103

原创 优秀程序员都有的习惯,你有吗?

及时更新任务清单当要实现一个功能点时,最好将较大的任务分割成较小且更清晰的任务,这些任务是相对独立的逻辑单元,可以单独进行测试。列一张这样可完成的较小任务的清单,并在完成之后勾选、更新。这样会形成自我激励,并促使自己去不断完成更多的小任务。目前主流项目管理软件中,往往内置任务分解和更新功能。如在禅道项目管理软件内,开发负责人进行系统分析,拆解成相对独立的任务并指派给个人,而开发人员可以在自己的页面清晰地看到任务数量及剩余工时,完成后进度将同步更新,这种持续的正向反馈会带来极大的成就感。遵循适当的版本控

2020-06-10 19:36:18 95

原创 从JVM上帝视角看Java中main()函数调用类方法限制

我们都知道,除了静态方法之外的所有方法都只能通过对象调用,没用对象调用的肯定是加了static关键字的静态方法,static方法可以通过类名调用。直接调用的话有两种情况,一是这个方法是包含main方法的类中的static方法,二是其他类的static方法,但在文件开头通过静态导入static import导入了此方法所在的类。一、为什么static修饰的可以直接调用?用static修饰的方法或属性在程序执行时会先被加载到内存中,所以在main方法中可以访问到,而没有用static修饰的方法或属性只有在n

2020-06-10 17:44:54 224

空空如也

空空如也

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

TA关注的人

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