JAVA
文章平均质量分 82
简要探讨JAVA
SunAlwaysOnline
开始工作的第3年!
展开
-
大厂面经(50+)整理,看看大佬们是如何临危不乱的
大厂面经(50+)整理,看看大佬们是如何临危不乱的原创 2022-08-17 17:55:11 · 1569 阅读 · 2 评论 -
面试常问集锦——分布式系列
到底啥是分布式系统开发经验?https://mp.weixin.qq.com/s?__biz=MzU0OTk3ODQ3Ng==&mid=2247484872&idx=1&sn=d28383f3397ef6b250afc5c182fcb200&chksm=fba6edcbccd164dd38701a0e06a381249ebb6ad9d0205df2c605b9634688d0dd58f00a2d645a&scene=21#wechat_redirect图解 |原创 2022-05-18 19:10:30 · 2036 阅读 · 0 评论 -
java面试高频点深入第四期
第一期内容第二期内容第三期内容mysql:如何解决幻读、锁的分类、主从复制、分库分表;redis:主从复制、热key、大key;框架:MyBatis一二级缓存、只有接口没有实现类怎么实现查询、MyBatis插件原理;分布式部分:接口幂等性、限流算法、降级与熔断;实操部分:排查慢sql;设计模式部分:原型模式、责任链模式、组合与聚合的区别;mq部分:保证消息不丢失、处理重复消息、消息有序性、消息堆积处理、mq宕机怎么保证数据不丢失、消息队列选型;linux.原创 2022-02-17 14:16:39 · 1489 阅读 · 1 评论 -
从源码中窥探出事务失效的8种原因
核心流程解读我们从一段简单的代码入手,从头到尾分析以下其中的奥秘。如果在一个controller中调用service方法,该方法被@Transaction注解修饰。controller方法: @GetMapping("/save") public String saveStudent() { testService.save(); return "success"; }service方法: @Transactional原创 2021-11-30 23:45:47 · 1491 阅读 · 0 评论 -
从源码角度结合详细图例剖析过滤器与拦截器
过滤器示例:@Componentpublic class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Filter.init"); } @Override public void doFilter(ServletRequest se原创 2021-11-14 22:30:35 · 2903 阅读 · 2 评论 -
面试常问集锦——多线程部分
多线程1、synchronizedhttps://blog.csdn.net/tongdanping/article/details/79647337synchronized锁的是什么?说说对它的理解修饰实例方法与对象时,需要获取的是实例对象的监视器锁。修饰静态方法与class时,需要获取的是Class对象的监视器锁。线程a访问实例对象的同步方法,线程b访问静态同步方法时,两者不互斥。在JDK1.6以前,使用synchronized就只有一种方式即重量级锁,而在JDK1.6以后,原创 2021-04-01 22:35:39 · 2588 阅读 · 0 评论 -
一次因线程池使用不当造成生产事故的排查记录与思考
某日当我点开熟悉的界面,一个又一个请求失败的提示赫然出现在屏幕上,不会是昨晚上线的代码有问题吧?吓得我急忙按F12查看了响应——"exception":"java.lang.OutOfMemoryError","message":"unable to create new native thread"出现了内存溢出的情况,无法创建更多的本地线程。接着查看了实例的监控大盘,发现每个实例的JVM线程数量都处于9000+的规模,且还有上涨的趋势。这是其中一个实例的线程数量监控图:10.原创 2021-11-09 23:51:03 · 3882 阅读 · 7 评论 -
java面试高频点深入第三期
ava-core:ConcurrentHashMap;多线程:AQS;jvm:内存结构、垃圾回收算法、GC Roots有哪些、创建对象的过程、垃圾回收器;mysql:MVCC机制、事务隔离级别;redis:字符串结构、键过期与内存淘汰机制、怎么解决雪崩、穿透与击穿、为什么会那么快;Spring:Bean的生命周期——BeanFactory 简介以及它 和FactoryBean的区别、Spring家族的区别及联系、如何解决循环依赖;分布式:分布式唯一ID、一致性哈希算法;实操部分:原创 2021-06-08 09:42:57 · 916 阅读 · 0 评论 -
9张图,带你了解一致性哈希原理
假设我们现在做一个简单的文件缓存服务,由于文件数过多,我们先使用3台机器用来存储文件。为了由文件名(假设文件名称不重复)能得到存储的机器,考虑先对文件名做hash运算,接着对3取余,得到的余数即为所在机器的编号。这套系统运行了很久,后来文件数量慢慢增多,3台机器存不下了,现在我们考虑扩充到4台。这个时候,我们的算法更新为hash(文件名)%5。那么使用该算法获取abc.txt文件所在的缓存机器时,在其hash值为10的时候,将会映射到0号机器上,而之前是存储在1号机器上的,这个时候就会重原创 2021-10-21 22:55:56 · 2349 阅读 · 5 评论 -
还记不住Spring Bean的生命周期?看这篇你就知道方法了!
一、前言上次我们在手把手教你解决循环依赖,一步一步地来窥探出三级缓存的奥秘中分析了Spring解决循环依赖的方式,在第6节中的doCreateBean(AbstractAutowireCapableBeanFactory类中)其实已经隐约看到了Bean的生命周期的几个阶段。 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] ar原创 2021-10-16 23:33:53 · 4124 阅读 · 7 评论 -
单例模式的6大种类,如何保证线程安全、反射安全以及序列化安全,这次终于通透了
单例模式在日常的开发过程中,我们需要使用到设计模式,而单例模式可谓是最常见的一种。正确的使用单例模式,不仅可以降低内存的使用率,也可以提升整个程序的运行效率。下面我来谈谈自己对单例模式的理解。【1】懒汉式特点:(1)是一种牺牲时间换取空间的策略(2)懒加载,只在需要的时候才实例化对象public class Singleton { private static Singlet...原创 2021-10-06 17:25:58 · 2380 阅读 · 3 评论 -
手把手教你解决循环依赖,一步一步地来窥探出三级缓存的奥秘
先不去管Spring中的循环依赖,我们先实现一个自定义注解,来模拟@Autowired的功能。一、自定义注解模拟@Autowired自定义Load注解,被该注解标识的字段,将会进行自动注入/** * @author qcy * @create 2021/10/02 13:31:20 *///只用在字段上@Target(ElementType.FIELD)//运行时有效,这样可以通过反射解析注解@Retention(RetentionPolicy.RUNTIME)public @原创 2021-10-03 23:10:01 · 3708 阅读 · 10 评论 -
new一个对象的背后,竟然有这么多可以说的
作为一名java开发工程师,每天要处理上千个对象,你居然说我没对象?就算没有对象,那就new一个呗。 GirlFriend gf = new GirlFriend();不会就这么容易吧?当然不会!那么GirlFriend对象到底是怎么产生的呢?一、类加载当遇到new指令时,jvm首先去常量池寻找该类的符号应用,找不到,则执行类加载。以下是类加载各个阶段的主要任务,现在记不住也没有什么关系。1. 装载我觉得这里使用装载更好一点。第一,可以避免与类加载过.原创 2021-09-17 22:20:04 · 2968 阅读 · 7 评论 -
java面试高频点深入第二期
java-core:=HashMap、内存泄漏;多线程:AQS、jvm:内存结构、垃圾回收算法、GC Roots有哪些、创建对象的过程、垃圾回收器;mysql:=索引结构选型、B树与B+树;redis:字符串结构、键过期与内存淘汰机制、怎么解决雪崩、穿透与击穿、为什么会那么快;Spring:BeanFactory 简介以及它 和FactoryBean的区别、Spring家族的区别及联系、Spring中的设计模式、自动装配原理、Spring事务原理、Transaction失效原理;分布原创 2021-06-04 15:11:01 · 994 阅读 · 0 评论 -
还不清楚JDK动态代理?从简单例子到源码再到字节码讲给你听
一、前言Spring中的AOP思想就是对代理模式的经典运用,下面先讲讲代理模式的核心思想,以静态代理为例。二、静态代理示例下面有这样一个例子,委托人在遭遇利益受损的时候,可以委托律师帮忙打官司。先定义一个描述行为的接口:package com.design.proxy.statics;public interface Action { void handle();}委托人,实现这个接口,主要的行为是寻找律师。package com.design.proxy.s原创 2021-09-10 00:00:45 · 922 阅读 · 0 评论 -
深度思考:老生常谈的双亲委派机制,JDBC、Tomcat是怎么反其道而行之的?
要说双亲委派机制,还得从类加载器的类型谈起一、类加载器的类型类加载器有以下种类:启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用类加载器(Application ClassLoader)启动类加载器内嵌在JVM内核中的加载器,由C++语言编写(因此也不会继承ClassLoader),是类加载器层次中最顶层的加载器。用于加载java的核心类库,即加载jre/lib/rt.jar里所有的class。由于启动类加载器原创 2021-09-05 22:47:01 · 2477 阅读 · 9 评论 -
还好我接住了面试官对线程池的夺命连环问
说说线程池的类图结构说说线程池的核心参数这些核心参数位于ThreadPoolExecutor的构造方法中: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit原创 2021-09-02 22:45:53 · 2058 阅读 · 4 评论 -
SpringBoot的自动装配原理、自定义starter与spi机制,一网打尽
一、前言Spring简直是java企业级应用开发人员的春天,我们可以通过Spring提供的ioc容器,避免硬编码带来的程序过度耦合。但是,启动一个Spring应用程序也绝非易事,他需要大量且繁琐的xml配置,开发人员压根不能全身心的投入到业务中去。因此,SpringBoot诞生了,虽然本质上还是属于Spring,但是SpringBoot的优势在于以下两个特点:(1)约定大于配置SpringBoot定义了项目的基本骨架,例如各个环境的配置文件统一放到resource中,使用active来启原创 2021-08-24 23:51:52 · 9768 阅读 · 14 评论 -
ThreadLocal源码、InheritableThreadLocal与内存泄露,这一篇给你捋顺了
ThreadLocal,可以理解为线程局部变量。同一份变量在每一个线程中都保存一份副本,线程对该副本的操作对其他线程完全是不可见的,是封闭的。一、ThreadLocal简单示例public class Main { private static ThreadLocal<Integer> tl = new ThreadLocal<>(); public static void main(String[] args) { tl.set(1)原创 2021-08-16 23:10:49 · 2393 阅读 · 2 评论 -
java面试高频点深入第一期
设计模式部分单例模式的7个问题https://mp.weixin.qq.com/s/BH4S7fcUTulsor4RTG5fZA原创 2021-05-30 21:17:44 · 1883 阅读 · 0 评论 -
Ribbon源码分析
Ribbon是Netflix公司开源的一个客户端负载均衡的项目,一般配合Eureka使用。不过为了降低其他干扰因素,专注于Ribbon,这一次我们脱离Eureka讲Ribbon。上一篇我们讲了RestTemplate源码分析,今天这一篇打算使用@Ribbon注解使得RestTemplate具有负载均衡的能力。一、简单的例子首先引入ribbon的依赖() <dependency> <groupId>org.springframew原创 2021-08-14 14:01:43 · 1850 阅读 · 0 评论 -
RestTemplate源码分析
相信RestTemplate是我们在SpringBoot中用过的最多的http客户端,今天来分析他的源码。一、最简单的用法首先需要向容器中注入RestTemplate的Bean实例@Configurationpublic class RestTemplateConfig { @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); }}接着直接使用即可原创 2021-08-07 16:45:32 · 2337 阅读 · 4 评论 -
面试常问集锦——Java基础部分
java基础部分《我想进大厂》之Java基础夺命连环16问https://mp.weixin.qq.com/s?__biz=MzkzNTEwOTAxMA==&mid=2247485644&idx=1&sn=db46ab83196031d8f563585b72a7b511&chksm=c2b24031f5c5c927bd125e219d4c2c810254f49ddc28988591978d27fe10a07eac85247bf89e&scene=178&原创 2021-03-12 16:48:18 · 2622 阅读 · 0 评论 -
从零开始实现一个stream流
本文转自java8 Stream的实现原理 (从零开始实现一个stream流)1.Stream 流的介绍1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式、更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算。1.2从零开始实现一个stream流 相信很多人在使用过java8的streamAPI接口之后,都会对其实现原理感到好奇,但往往在看到jdk的stream源码后却被其复杂的抽象、封装给弄糊涂了,而无法很好的理解其背后的原.转载 2020-12-03 14:11:51 · 1024 阅读 · 0 评论 -
HashMap夺命连环问
1、说说HashMap的结构在JDK7时,采用数组+链表结构在JDK8时,采用数组+链表+红黑树的结构,在一定条件下,链表会转化为红黑树。以上图来源于:https://blog.csdn.net/goosson/article/details/810297292、数组和链表的用处是什么数组用来随机查找,能够根据hash值快速定位到Node的位置。链表是用来解决hash冲突的,多个元素定位到同一个Node时,用链表将它们顺序串起来。3、为什么要转红黑树单链表的查询时间复原创 2020-09-30 17:08:33 · 3130 阅读 · 1 评论 -
这样写代码,直接被主管撵出去
一、简化if、else减少if、else判断的分支。当条件简单时,可以直接return一个表达式。优化前: //判断该数是否是正数 public boolean isPositive(int num) { if (num > 0) { return true; } else { return false; } }优化后: //判断该数是否是正数 p原创 2020-09-29 18:03:37 · 1903 阅读 · 3 评论 -
面试官:如何停止一个正在运行的线程?我又懵了
上一篇讲了如何等待子线程运行结束,原文https://blog.csdn.net/qq_33591903/article/details/108496110。本篇讲讲如何终止子线程暴力停止——Stop方法package com.qcy.testStopThread;/** * @author qcy * @create 2020/09/16 09:40:34 */public class Main1 { static class MyThread extends Threa原创 2020-09-16 16:45:10 · 1800 阅读 · 0 评论 -
你真得懂Thread.join吗?
Thread类中的join方法,用于等待某个线程执行结束。简单示例以下简单的代码,会让主线程等待子线程执行结束再执行。如果去掉t.join(),可能主线程就直接退出了,子线程都来不及执行。package com.qcy.testJoin;/** * @author qcy * @create 2020/09/10 17:17:03 */public class Main { public static void main(String[] args) throws Inte原创 2020-09-11 10:32:27 · 3680 阅读 · 0 评论 -
面试官:如何让主线程等待所有的子线程执行结束之后再执行?我懵了
使用Thread的join方法package com.qcy.testThreadFinish;/** * @author qcy * @create 2020/09/09 17:05:23 */public class Case1 { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> {原创 2020-09-09 17:54:40 · 6770 阅读 · 4 评论 -
SpringBoot中的异步调用@Async
如何开启异步调用在SpringBoot中,只需要给方法加上@Async注解,就能将同步方法变为异步调用。首先在启动类上添加@EnableAsync,即开启异步调用。/** * @author qcy */@SpringBootApplication@EnableAsyncpublic class AsyncApplication { public static void main(String[] args) { SpringApplication.run(原创 2020-09-09 17:52:37 · 1202 阅读 · 0 评论 -
什么,你还不会用CompletableFuture?
CompleteFuture原创 2020-09-08 14:11:01 · 2202 阅读 · 0 评论 -
谈谈Runnable、Future、Callable、FutureTask之间的关系
谈谈Runnable、Future、Callable、FutureTask之间的关系原创 2020-09-07 15:12:33 · 1960 阅读 · 0 评论 -
一致性哈希算法的解析与实现
转载自http://www.zsythink.net/archives/1182,不过在文尾加了对算法的java实现在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的应用场景。场景描述假设,我们有三台缓存服务器,用于缓存图片,我们为这三台缓存服务器编号为0号、1号、2号,现在,有3万张图片需要缓存,我们希望这些图片被均匀的缓存到这3台服务器上,以便原创 2020-09-01 22:55:20 · 879 阅读 · 0 评论 -
基于SpringBoot与数据库表记录的方式实现简单的分布式锁
同一进程内的不同线程操作共享资源时,我们只需要对资源加锁,比如利用JUC下的工具,就可以保证操作的正确性。对JUC不熟悉的同学,可以看看以下的几篇文章:浅说Synchronized Synchronized的优化 Unsafe类 浅探CAS实现原理 CountDownLatch实现原理 ThreadLocal使用不好,小心造成内存泄露! 更多文章,在我的多线程专栏中但是,为了高可用,我们的系统总是多副本的,分布在不同的机器上,以上同进程内的锁机制就不再起作用。为了保证多副本系统对共享资源的原创 2020-08-25 22:58:40 · 659 阅读 · 0 评论 -
谈谈并行流parallelStream
一、parallelStream内部使用了哪些线程Java8中提供了能够更方便处理集合数据的Stream类,其中parallelStream()方法能够充分利用多核CPU的优势,使用多线程加快对集合数据的处理速度。不熟悉Stream类的同学,可以先参考我的另外一篇文章Java8中Stream的常用方法以一个简单的例子,来看看parallelStream内部到底使用了哪些线程 Integer[] array = new Integer[]{1, 2, 3, 4, 5};原创 2020-08-14 12:32:07 · 29439 阅读 · 0 评论 -
Java8之Optional扫盲
在java8中,引入Optional类,来缓解对每次都需要变量判空的尴尬。Optional在一定程度上,能够减少判空产生的级联深度,运用lambda表达式,也能够在一定程度上简化代码。创建一个Optional1、创建一个可以包含null的Optional Optional<String> optional = Optional.ofNullable(null);2、创建一个包含null的Optional Optional<Object> empt原创 2020-08-12 23:04:20 · 1235 阅读 · 2 评论 -
SpringBoot集成RabbitMQ
容器化运行RabbitMQ,可以参考我之前的一篇文章容器化运行RabbitMQ本篇不讲解RabbitMQ的理论知识,均采用最简配置那么消息队列,需要一个消息的生产者与消费者创建一个生产者:引入相关的依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-a原创 2020-08-06 17:02:35 · 382 阅读 · 0 评论 -
如何排查java应用的死锁
首先,我们构造一个死锁场景。如何构造一个死锁呢?原创 2020-08-04 22:13:12 · 486 阅读 · 0 评论 -
浅谈JVM调优中的两个小知识点
对JVM的调优,需要大量的场景以及经验,本篇主要是从一个理论的角度,粗浅地对堆这边不太熟悉的同学,可以先参考我的这一篇文章说说java中的堆区我把堆区的主要结构以及参数放在下面,这样可以参照着图来看:一、如何设置最大年龄每发生一次Young GC,就会将Eden区和当前的Survivor区的存活对象一次性地转入到另外一个Survivor区中,并将之前的Eden区以及Survivor区清空。所以年轻代的存活对象,基本上就是在两块Survivor区中换来换去,每换一次,年龄增加1岁。当到达最原创 2020-08-03 22:44:10 · 306 阅读 · 0 评论 -
ThreadLocal使用不好,小心造成内存泄露!
一、前言对ThreadLocal不熟悉的同学,可以先参考我的另外一篇文章浅谈ThreadLocal在讨论内存泄漏之前,需要明白java中的四种引用,同样可以移步到java中的四种引用原创 2020-06-14 00:24:23 · 1670 阅读 · 0 评论