java
文章平均质量分 92
lalaBad
善于总结,积极向上
展开
-
线程池中多余的线程是如何回收的?
线程池是如何回收工作线程的?简单分析了一下,加深对线程池的理解吧。下面以JDK1.8为例进行分析1.runWorker(Worker w)工作线程启动后,就进入runWorker(Worker w)方法。里面是一个while循环,循环判断任务是否为空,若不为空,执行任务;若取不到任务,或发生异常,退出循环,执行processWorkerExit(w, completedAbruptly); 在这个方法里把工作线程移除掉。取任务的来源有两个,一个是firstTask,这个是工作线程第一次.原创 2020-10-31 10:11:57 · 3460 阅读 · 1 评论 -
总结java中的“锁”
一、介绍首先, java 的锁分为两类: 第一类是synchronized同步关键字,这个关键字属于隐式的锁,是 jvm 层面实现,使用的时候看不见; 第二类是在 jdk5 后增加的Lock接口以及对应的各种实现类,这属于显式的锁,就是我们能在代码层面看到锁这个对象,而这些个对象的方法实现,大都是直接依赖 CPU 指令的,无关 jvm 的实现。 接下来就从synchronized和Lock两方面来讲。二、synchronized2.1 synchronized...原创 2020-09-19 11:46:11 · 342 阅读 · 0 评论 -
封装redis分布式锁
分布式锁通常有很多选择,基于 Redis 的,基于 Zookeeper 的,基于数据库等等方案。Redis 用于缓存数据,在项目中都有使用,所以使用 Redis 来做分布式锁的会稍微多些。如果用 Redis 来做锁,可以直接用开源的方案,比如redisson。最常见的使用方式如下所示:RLock lock = redisson.getLock("anyLock");lock.lock();run();lock.unlock();获取锁对象,调用 lock()加锁,执行业务逻辑,调原创 2020-09-17 15:57:29 · 427 阅读 · 0 评论 -
解决幂等性问题方法大全
我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。例如 1. 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果;2. 我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统 bug 重发,也应该只扣一次钱;3. 发送消息,也应该只发一次,同样的短信发给用户,用户会哭的;4. 创建业务订单,一次业务请求只能创建一个,创建多个就会出大问题等等很多重要的情况都需要幂等的特性来支持。幂等(idempotent、idempotence)是一个数学与计算机学原创 2020-05-08 20:24:07 · 9741 阅读 · 0 评论 -
小小理解悲观锁和乐观锁
Java 按照锁的实现分为乐观锁和悲观锁,乐观锁和悲观锁并不是一种真实存在的锁,而是一种设计思想,乐观锁和悲观锁对于理解 Java 多线程和数据库来说至关重要,那么本篇文章就来详细探讨一下这两种锁的概念以及实现方式。悲观锁悲观锁是一种悲观思想,它总认为最坏的情况可能会出现,它认为数据很可能会被其他人所修改,所以悲观锁在持有数据的时候总会把资源或者数据锁住,这样其他线程想要请求这个资源...原创 2020-04-01 20:42:32 · 6301 阅读 · 0 评论 -
Kafka快的原因
在过去的几年里,软件架构领域发生了巨大的变化。人们不再认为所有的系统都应该共享一个数据库。微服务、事件驱动架构和CQRS(命令查询的责任分离 Command Query Responsibility Segregation)是构建当代业务应用程序的主要工具。除此以外,物联网、移动设备和可穿戴设备的普及,进一步对系统的近实时能力提出了挑战。首先让我们对“快”这个词达成共识,这个词是多方面的、复杂...原创 2020-03-28 17:02:38 · 8700 阅读 · 0 评论 -
rabbit死信队列出现TTL时间超过但是进入不了死信队列情况
原因是线上一场时间不精准问题导致的。总的来说,为了让消息队列消息更加健壮,于是配置了超时时间和死信队列。但是出现的问题是,配置队列的TTL,总有一些消息在超过TTL时间后,进入不了死信队列,影响及时的业务通知系统。问题在什么地方呢?prefetch: 1属性配置上。以下是问题重现,与解决过程1.环境搭建1.1rabbit服务器略1.2springboot工程略...原创 2020-02-24 17:25:43 · 40826 阅读 · 2 评论 -
spring容器的本质探究下
5.8对象实例化到了这一步,我们已经完整的把所有xml配置文件里面定义的对象转化到BeanFactory里面的beanDefinitionMap,但是此时IOC容器还没开始实例化这些对象,接下来就是实例化的过程。回顾一下我们分析入口的refresh()方法,里面的finishBeanFactoryInitialization(beanFactory)就是对象的实例化过程,我们重点来分析这个方法...原创 2019-04-24 12:37:11 · 128529 阅读 · 0 评论 -
JVM核心知识体系
1.问题 1、如何理解类文件结构布局? 2、如何应用类加载器的工作原理进行将应用辗转腾挪? 3、热部署与热替换有何区别,如何隔离类冲突? 4、JVM如何管理内存,有何内存淘汰机制? 5、JVM执行引擎的工作机制是什么? 6、JVM调优应该遵循什么原则,使用什么工具? 7、JPDA架构是什么,如何应用代码热替换? 8、JVM...原创 2019-04-15 13:26:06 · 155934 阅读 · 1 评论 -
偏向锁
流程讲解当JVM启用了偏向锁模式(JDK6以上默认开启),新创建对象的MarkWord中的ThreadId为0,说明此时处于可偏向但未偏向任何线程,也叫做匿名偏向状态(anonymouslybiased)。偏向锁逻辑1.线程A第一次访问同步块时,先检测对象头MarkWord中的标志位是否为01,依此判断此时对象锁是否处于无所状态或者偏向锁状态(匿名偏向锁);2...原创 2019-04-15 13:07:37 · 155030 阅读 · 13 评论 -
锁原理之synchronized
蜀国有一个皇帝叫蜀道难,他比较难伺候,别的皇帝早朝都是在大殿上同时接见所有大臣,共商国是。他不一样,他说早朝你们不要有事没事都跑过来叽叽喳喳,有事则来,无事则该干啥干啥去,然后安排太监每天早上在大门口守着,每次只允许一个大臣进来汇报情况。“你敢多放进来一个就砍脑袋的干活。”太监赶紧下跪,说“谪!”。第一天,太监传话钦天监求见,皇帝允了,钦天监上殿报曰:“臣禀报,昨日我司夜观星象,西方忽现王星...原创 2019-04-15 13:03:06 · 129846 阅读 · 1 评论 -
spring容器的本质探究上
1.问题 1、什么是spring容器? 2、spring容器如何启动? 3、spring容器的本质是什么? 4、spring容器在spring家族中扮演什么地位? 5、spring容器设计思想? 2.关键词容器,会话,上下文,工厂,注册表,解析,定义,初始化,懒加载BeanFactory,BeanDefinition,ApplicationCo...原创 2019-04-22 15:09:47 · 200841 阅读 · 0 评论 -
IDEA 阅读源码绝技
1、定位到方法实现类publicstaticObjectgetBean(String name){ returnapplicationContext.getBean(name);}如以上代码,IDEA如何跳转到getBean方法的实现类?在IDEA中,CTRL+鼠标左击默认会跳到方法所在的接口,如getBean就会跳到BeanFactory接口...原创 2019-04-17 12:11:39 · 151957 阅读 · 1 评论 -
分布式架构知识梳理
1.问题 1、何为分布式何为微服务? 2、为什么需要分布式? 3、分布式核心理论基础,节点、网络、时间、顺序,一致性? 4、分布式是系统有哪些设计模式? 5、分布式有哪些类型? 6、如何实现分布式? 2.关键词节点,时间,一致性,CAP,ACID,BASE,P2P,机器伸缩,网络变更,负载均衡,限流,鉴权,服务发现,服务编排,降级,熔...原创 2019-04-21 18:55:01 · 152133 阅读 · 4 评论 -
高并发编程知识梳理
1.问题 1、什么是线程的交互方式? 2、如何区分线程的同步/异步,阻塞/非阻塞? 3、什么是线程安全,如何做到线程安全? 4、如何区分并发模型? 5、何谓响应式编程? 6、操作系统如何调度多线程? 2.关键词同步,异步,阻塞,非阻塞,并行,并发,临界区,竞争条件,指令重排,锁,amdahl,gustafson3.全文概要由于...原创 2019-04-21 17:00:27 · 136355 阅读 · 0 评论 -
JVM虚拟机实现机制
1.问题 1、JAVA文本文件如何被翻译成CLASS二进制文件? 2、如何理解CLASS文件的组成结构? 3、虚拟机如何加载使用类文件的生命周期? 4、虚拟机系列诊断工具如何使用? 5、虚拟机内存淘汰机制? 6、虚拟机指令集架构? 2.关键词编译,魔数,常量池,字面量,数据表,堆栈,方法区,程序计数器,内存引用,内存溢出,垃圾回收器,...原创 2019-04-29 10:24:41 · 118942 阅读 · 0 评论 -
设计权限管理模块
我们比较常见的就是基于角色的访问控制,用户通过角色与权限进行关联。简单地说,一个用户拥有多个角色,一个角色拥有多个权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间、角色与权限之间,通常都是多对多的关系。如下图:基于这个,得先了解角色到底是什么?我们可以理解它为一定数量的权限的集合,是一个权限的载体。例如:一个论坛的“管理员”、“版主”,它们都是角色。但是...原创 2019-05-15 12:25:58 · 89210 阅读 · 0 评论 -
java中的日志使用--slf4j,log4j,logback
java开发过程中为了找问题方便或是统计信息方便,总免不了要打各种日志。之前的各个项目都是配置好的,maven配置的时候,会看到各种类型的Log包:slf4j、log4j、commons-log、logback等等,看着就烦,今天仔细了解了一下,有点收获,记录一下起因使用JAVA的kafka api写main方法进行开发测试,发现总报错 1 2 3 ...原创 2018-10-15 09:58:23 · 212791 阅读 · 0 评论 -
为什么Spring默认把 Bean 设计成单例的?
熟悉Spring开发的朋友都知道Spring提供了5种scope分别是singleton、prototype、request、session、global session。如下图是官方文档上的截图,感兴趣的朋友可以进去看看这五种分别有什么不同。今天要介绍的是这五种中的前两种,也是Spring最初提供的bean scope singleton 和 prototype。Spring官方文档介绍...原创 2019-09-08 16:33:05 · 52499 阅读 · 0 评论 -
深度剖析-Spring 如何解决循环依赖?
在关于Spring的面试中,我们经常会被问到一个问题:Spring是如何解决循环依赖的问题的。这个问题算是关于Spring的一个高频面试题,因为如果不刻意研读,相信即使读过源码,面试者也不一定能够一下子思考出个中奥秘。本文主要针对这个问题,从源码的角度对其实现原理进行讲解。1. 过程演示关于Spring bean的创建,其本质上还是一个对象的创建,既然是对象,读者朋友一定要明白一点...原创 2019-09-08 16:27:38 · 41960 阅读 · 1 评论 -
层层递进打造你的重试机制
重试机制在分布式系统中,或者调用外部接口中,都是十分重要的。重试机制可以保护系统减少因网络波动、依赖服务短暂性不可用带来的影响,让系统能更稳定的运行的一种保护机制。为了方便说明,先假设我们想要进行重试的方法如下:@Slf4j@Componentpublic class HelloService { private static AtomicLong helloTimes...原创 2019-08-25 15:49:32 · 48601 阅读 · 0 评论 -
值得记录的真实面试经验(for 高级)
在此感谢minus同学分享自己的面经供广大同学参考写在前面本文是楼主前两个月 N 家公司的面试经历,总结复盘了面试现场,个人认为干货还是不少,在此和大家分享。ps:至于标题所说的薪资,是面试过程中一个有意思的小插曲,但是确有其事,不是标题党。。。这里先卖个关子,请各位看官往后看!^_^自报家门先做个自我介绍,楼主坐标帝都,5年经验,跳槽之前在一家...原创 2019-06-12 11:18:46 · 83271 阅读 · 0 评论 -
千万级调用的电商服务架构实现总览
618相信有不少小伙伴也参加了这场促销抢购吧,但作为一个程序员,你又知道促销期千万级别访问量背后的架构及实现吗?电商是典型的促销拉动式场景,也是价格战驱动的场景。618和双11都是典型的促销活动。其实都是在抢用户、扩市场占有率。在这样的场景之下,对秒杀、抢购是很热衷的玩法。促销式的拉动对系统的挑战是什么呢?从上图可以看到:对系统的高可用要求非常高的,需要99.99%的高可用性。快速...原创 2019-06-21 10:48:11 · 70087 阅读 · 0 评论 -
千万并发,阿里淘宝的 14 次架构演进之路!
写在前面本文以淘宝为例,介绍从一百个并发到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计的原则。 在介绍架构之前,为了避免部分读者对架构设计中的一些概念不了解,下面对几个最基础的概念进行介绍: 分布式 系统中的多个模块在不同服务器上部署,即可称为分布式系统,如Tomcat和数据库分别部...原创 2019-06-19 12:32:59 · 89578 阅读 · 0 评论 -
据说一个比Spring Boot快44倍的Java框架!
官方号称可以比 Spring Boot 快 44 倍,居然这么牛逼,有这么神奇吗?今天带大家来认识一下。这个框架名叫:light-4j。官网简介:A fast, lightweight and more productive microservices framework很简单,翻译过来就是:一个快速、轻量级和更高效的微服务框架。为什么叫light-4j?全称应...原创 2019-03-28 12:38:43 · 129605 阅读 · 0 评论 -
基于SpringBoot微服务异常处理最佳实践
本文通过对RESTful WebService中异常处理的几个关键点如自定义错误码、定制错误消息、自定义异常、全局异常处理进行介绍,分享本人对Spring异常处理和对RESTful API设计的思考和实践。随着前后端分离,前端工程化,后端微服务化,越来越多的应用都开始倾向于使用 RESTful API 为各种各样的客户端提供服务。设计一套优雅的 API 服务,需要诸多考量,而异常处理往往被忽视...原创 2019-03-27 09:21:09 · 153025 阅读 · 4 评论 -
java面试IOC
广义的 IOCIoC(Inversion of Control) 控制反转,即“不用打电话过来,我们会打给你”。两种实现: 依赖查找(DL)和依赖注入(DI)。IOC 和 DI 、DL 的关系(这个 DL,Avalon 和 EJB 就是使用的这种方式实现的 IoC):DL 已经被抛弃,因为他需要用户自己去是使用 API 进行查找资源和组装对象。即有侵入性。 DI 是 Sp...原创 2018-10-25 11:08:42 · 35008 阅读 · 0 评论 -
简单学习理解Java 热部署
在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。对于某些大型的应用来说,每次的重启都需要花费大量的时间成本。虽然 osgi 架构的出现,让模块重启成为可能,但是如果模块之间有调用关系的话,这样的操作依然会让应用出现短暂的功能性休克。本文将探索如何在不破坏 Java 虚...原创 2018-10-25 11:02:12 · 251293 阅读 · 0 评论 -
【spring】[Xlint:invalidAbsoluteTypeName]error 解决
错误:启动spring容器时报类似 [Xlint:invalidAbsoluteTypeName]的错误 问题分析:spring aop进行事务控制时配置切点表达式错误上面的切点表达式没有匹配方法,所有报错了 问题解决:是不是非常简单,编码要小心啊...原创 2018-10-25 10:46:29 · 33681 阅读 · 2 评论 -
工作中一次改zookeeper源码的记录
zk中zxid有64位,分成两部分: 高32位是Leader的epoch:选举时钟,每次选出新的Leader,epoch累加1 低32位是在这轮epoch内的事务id:对于用户的每一次更新操作集群都会累加1。这么设计会存在什么问题?Zookeeper 的事务 ID 有可能会超过 32 位。epoch增长非常慢,超过32位需要非常久的时间,几乎可以忽略这个问题,但是事务 ID 似乎不...原创 2018-10-16 22:08:10 · 280409 阅读 · 1 评论 -
Redis client链接池配置不当引起的频繁full gc
负责的一个RPC服务就是简单的从Redis Cluster中读取数据,然后返回给上游。理论上该服务的对象大部分都应该是朝生夕死的,但是笔者查看gc log 的时候发现 age >=2 的对象还真有不少,甚至和age=1的对象差不多。也就是说对象从eden晋升到Survivor,之后的每次young gc 这些对象都是在Survivor区域中移动,直到晋升到old 区域中。GC log 如下:...原创 2018-10-18 22:26:07 · 49712 阅读 · 1 评论 -
springcloud知识速记与上手
一、前言首先你得知道什么是springboot,最好有自己的理解可以参考这个文章:https://www.cnblogs.com/badofboy/p/9575870.htmlspringcloud知识速记与上手 二、集群/分布式/微服务/SOA是什么?看到这些词(集群/分布式/微服务/SOA)的时候,感觉就是遥不可及的(高大尚的技术!!)。就好像刚学Java面向对...原创 2018-09-02 23:05:12 · 24374 阅读 · 0 评论 -
springboot2.0参考手册
https://blog.tengshe789.tech/2018/08/04/springboot/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io这是一篇优雅的使用原创 2018-08-14 22:17:26 · 24239 阅读 · 0 评论 -
电商项目中SPU与SKU的设计
1. 先说明几个概念. 电商网站采用在商品模块,常采用spu+sku的数据结构算法,这种算法可以将商品的属性和商品的基本信息分离,分开维护,这样我们就可以在不同的类目下自定义商品信息和分类的属性信息,我们的业务系统就可以存储不同门类的商品信息了 •SPU = Standard Product Unit(标准化产品单元)SPU是商品信息聚合的最小单位,是一组可复用标准化信息的集合•SKU=stock...原创 2018-07-02 16:43:12 · 30999 阅读 · 0 评论 -
springMVC@Service注解引发的空指针问题
遇到了一个由@Service注解引发的空指针问题时,才真正意识到乱用注解的危害,同时也有了下文的深入探讨!事件起因接到业务方需求需要封装上游的一个HTTP接口来提供系统内的服务支持,我封装这个接口并通过本地单元测试后就部署到测试环境中开始测试了。没想到一测试就报NullPointerException异常,异常栈信息如下:ERROR [qtp384587033-86] 2015-12-21 16:...原创 2018-04-28 21:26:07 · 3340 阅读 · 0 评论 -
Java注解(Annotation)基本概念、自定义注解、注解解析器
深入理解Java:注解(Annotation)基本概念什么是注解(Annotation): Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法。Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据。 Annotation(注解)是J...转载 2018-05-17 16:03:03 · 3089 阅读 · 1 评论 -
springcloud spring-boot-starter-actuator与datasource引起的循环依赖问题
在部署springcloud微服务的时候,使用了SR2版本,出现spring默认数据源Hikari注入的循环依赖问题最后是如何解决的呢?在当前微服务中添加spring: cloud: refresh: refreshable: none即可 ...原创 2018-11-28 16:02:51 · 36533 阅读 · 1 评论 -
【面试】从一道简单的“SpringBoot配置文件”相关面试题,我就能知道你的水平
面试要套路,也要技巧。别被背题目的兄弟们给忽悠了。【你来发挥】你比较喜欢什么技术,哪一种最熟?一般自信的面试官都喜欢问这个问题,这次面试的小伙比较年轻,咱也装回B,不然都对不起自己。答: 我比较喜欢Spring,比较有趣。目的: 希望应聘者能够有广度且有深度。如果最感兴趣的是Spring本身,而不是其上的解决方案,那顶多会承担被分解后的编码工作。巧了,咱也熟。【工作经...原创 2018-12-01 20:56:15 · 87575 阅读 · 2 评论 -
系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路
处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本文主要针对系统运行缓慢这一问题,提供该问题的排查思路,从而定位出问题的代码点,进而提供解决该问题的思路。对于线上系统突然产生的运行缓慢问题,如果该问题导致线上系统不可用,那么首先需要做的就是,导出jst...原创 2019-03-20 16:51:46 · 101444 阅读 · 0 评论 -
2019年1月寒冬互联网一线的面经
面试的岗位主要是后端,历经三周,面了北京大大小小的几家公司,最后收获了满意的offer。 自己也成长收获了不少, 谨以笔记,自己可以日后回忆,也希望能帮助到最近寒冬下需要找工作的同学,在文章的后面会附上一点小心得和建议。一直做java后端。 自己定位大概能到p6+的水平。有大厂经验,所以面试机会总体来说还是挺多的。3.过程大概是从元旦过后开始写简历,投简历,从7号开始陆陆续续...原创 2019-01-28 21:14:37 · 69470 阅读 · 0 评论