
面试
文章平均质量分 89
春天的早晨
https://github.com/Allenmcc
展开
-
Spring AOP调用本类的事务方法失效
文章目录一、JDK动态代理1、实现方式2、反编译代理类的文件3、Proxy部分源码总结:问题一:本类中方法调用同类中方法会不会走代理?问题二:为什么必须要实现接口才能使用JDK动态代理?二、cglib动态代理1、实现方式2、代理类字节码编译核心问题:本类中调用本类自己的方法事务失效?1、对于JDK动态代理2、对于cglib动态代理首先要说明失效问题,必须要了解JDK动态代理和cglib动态代理的原理和调用方式。一、JDK动态代理1、实现方式理解JDK动态代理的实现原理:1.拿到被代理类的引用,并且转载 2022-05-04 21:48:11 · 3676 阅读 · 0 评论 -
spring事务(注解 @Transactional )失效的12种场景
文章目录一 、事务不生效【七种】1.访问权限问题 (只有public方法会生效)2. 方法用final修饰,不会生效3.同一个类中的方法直接内部调用,会导致事务失效3.1 新加一个Service方法3.2 在该Service类中注入自己3.3 通过AopContent类4.(类本身) 未被spring管理5.多线程调用6.(存储引擎)表不支持事务7.未开启事务二、事务不回滚【五种】1.错误的传播特性2.自己吞了异常3.手动抛了别的异常4.自定义了回滚异常5.嵌套事务回滚多了三、大事务与编程式事务1. 大事务转载 2022-05-04 15:57:04 · 35948 阅读 · 9 评论 -
大事务问题
大事务引发的问题:死锁,锁等待,回滚时间长 接口超时,数据库主从延迟,并发情况下数据库连接池被打满1.@Transactional注解是通过Spring的AOP起作用的,但是如果使用不当,事务功能可能会失效。2.@Transactional注解一般加在某个业务方法上,会导致整个业务方法都在这个事务中,粒度太大,不好控制事务范围。文章目录1.少于@Transactional注解2.将查询(select)方法放到事务外2.1 新加上一个service方法2.2 在该Service类中注入自己2.3 在该.转载 2022-05-03 20:14:56 · 1236 阅读 · 0 评论 -
TCP三次握手/四次挥手/长连接/短连接
TCP 三次握手 长链接 短连接转载 2016-06-05 16:36:59 · 4536 阅读 · 0 评论 -
Java中Volatile关键字
基本概念先补充一下概念:Java 内存模型中的可见性、原子性和有序性。可见性可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果。另...转载 2019-03-02 21:06:04 · 198 阅读 · 0 评论 -
Spring AOP 及动态代理和静态代理区别
AOP是Aspect Oriented Programing的简称,面向切面编程。AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理、缓存、对象池管理以及日志记录。AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中。AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类,其中静态代理是指使用 AOP 框原创 2017-06-04 16:51:37 · 2475 阅读 · 0 评论 -
Spring事务传播机制
文章目录1. REQUIRED2. SUPPORTS3. MANDATORY4. REQUIRES_NEW5. NOT_SUPPORTED6. NEVER7. NESTEDSpring管理的事务是逻辑事务,而且物理事务和逻辑事务最大差别就在于事务传播行为,事务传播行为用于指定在多个事务方法间调用时,事务是如何在这些方法间传播的。下面以a.save()里调用了b.save()举例,事务方法之间调用时事务如何传播。@Servicepublic class A { @Autowired privat转载 2021-05-24 16:56:55 · 7537 阅读 · 1 评论 -
MyBatis中#{}和${}的区别详解 区别
区别#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”.将传入的数据直接显示生成在sql中。如:orderby将传入的数据直接显示生成在sql中。如:orderbyuser_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为转载 2021-05-19 17:10:25 · 429 阅读 · 0 评论 -
Spring Boot 自动配置原理
文章目录原理Spring Boot的配置文件工作原理剖析@EnableAutoConfiguration自动配置生效总结原理Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文转载 2021-05-19 11:43:19 · 170 阅读 · 0 评论 -
Java并发之AQS详解
文章目录一、概述二、框架三、源码详解3.0 结点状态waitStatus3.1 acquire(int)3.1.1 tryAcquire(int)3.1.2 addWaiter(Node)3.1.2.1 enq(Node)3.1.3 acquireQueued(Node, int)3.1.3.1 shouldParkAfterFailedAcquire(Node, Node)3.1.3.2 parkAndCheckInterrupt()3.1.3.3 小结3.1.4 小结3.2 release(int)3.转载 2021-05-04 10:40:41 · 99 阅读 · 0 评论 -
java web 过滤器跟拦截器的区别
拦截器:拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。 在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一转载 2016-10-12 10:54:52 · 346 阅读 · 0 评论 -
redis 跳表
zsetzset是可排序的set。与hash的实现方式类似,如果元素个数不多且不大,就使用压缩列表ziplist来存储。不过由于zset包含了score的排序信息,所以在ziplist内部,是按照score排序递增来存储的。意味着每次插入数据都要移动之后的数据。跳表跳表(skiplist)是另一种实现dict的数据结构。跳表是对链表的一个增强。我们在使用链表的时候,即使元素的有序排列的,但如果要查找一个元素,也需要从头一个个查找下去,时间复杂度是O(N)。而跳表顾名思义,就是跳跃了一些元素,可以抽象多转载 2021-05-18 11:28:39 · 4480 阅读 · 0 评论 -
微服务开发之熔断器
一般在微服架构中,有一个组件角色叫熔断器。顾名思义,熔断器起的作用就是在特定的场景下关掉当前的通路,从而起到保护整个系统的效果。在微服务架构中,一般我们的独立服务是比较多的,每个独立服务之间划分责任边界,并通过约定协议接口来进行通信。当我们的调用链路复杂依赖多时,很可能会发生雪崩效应。假设有这么一个场景,有A, B, C, D四个独立服务,A会依赖B,C,D;当D发生负载过高或网络异常等导致响应过慢或超时时,很可能A会因此堆积过多的等待链接,从而导致A的状态也转为异常,后面依赖到A的其他服务跟着发生链式转载 2021-05-17 17:36:21 · 409 阅读 · 0 评论 -
java Map List和Set区别
java集合的三种类型Set(集) List(列表) Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据。 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型。世间上本来没有集合,(只有数组参考C语转载 2016-08-09 16:09:11 · 427 阅读 · 0 评论 -
Spring Boot Starters启动器
文章目录Starters是什么?Starters命名Starters分类1. Spring Boot应用类启动器2. Spring Boot生产启动器3. Spring Boot技术类启动器Starters是什么?Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数据库,只要加入spring-boot-starter-data-jpa启动器依赖就能使用了。Starters转载 2021-05-07 09:55:27 · 550 阅读 · 0 评论 -
Spring循环依赖及解决方式
文章目录1. 什么是循环依赖?2. 怎么检测是否存在循环依赖3. Spring怎么解决循环依赖4.基于构造器的循环依赖5.基于setter属性的循环依赖6.结束语1. 什么是循环依赖?循环依赖其实就是循环引用,也就是两个或者两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。如下图:注意,这里不是函数的循环调用,是对象的相互依赖关系。循环调用其实就是一个死循环,除非有终结条件。Spring中循环依赖场景有:(1)构造器的循环依赖(2)field属性的循环依赖转载 2021-05-04 18:28:47 · 758 阅读 · 0 评论 -
分布式ID
文章目录一、为什么要用分布式ID?1、什么是分布式ID?2、那么分布式ID需要满足那些条件?二、 分布式ID都有哪些生成方式?1、基于UUID优点缺点2、基于数据库自增ID优点缺点3、基于数据库集群模式优点缺点4、基于数据库的号段模式5、基于Redis模式6、基于雪花算法(Snowflake)模式7、美团(Leaf)号段模式snowflake模式优点缺点双buffer优化总结一、为什么要用分布式ID?在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征?1、什转载 2021-05-04 17:49:02 · 234 阅读 · 0 评论 -
CyclicBarrier 使用详解
文章目录1. CyclicBarrier 是什么?2. 怎么使用 CyclicBarrier2.1 构造方法2.2 重要方法2.3 基本使用2.3.1 需求2.3.2 代码实现3. CyclicBarrier 使用场景4. 原理5. CyclicBarrier 与 CountDownLatch 区别1. CyclicBarrier 是什么?从字面上的意思可以知道,这个类的中文意思是“循环栅栏”。大概的意思就是一个可循环利用的屏障。它的作用就是会让所有线程都等待完成后才会继续下一步行动。举个例子,就像转载 2021-05-03 21:48:29 · 1331 阅读 · 0 评论 -
CountDownLatch的使用场景及原理
文章目录CountDownLatch的两种使用场景场景1 让多个线程等待:模拟并发,让并发线程一起执行场景2 让单个线程等待:多个线程(任务)完成后,进行汇总合并CountDownLatch 工作原理CountDownLatch与Thread.joinCountDownLatch与CyclicBarrierCountDownLatch的两种使用场景先来看看 CountDownLatch 的源码注释;/** * A synchronization aid that allows one or more转载 2021-05-03 20:47:49 · 1269 阅读 · 0 评论 -
InheritableThreadLocal 实现原理
文章目录前言InheritableThreadLocal 概念InheritableThreadLocal 原理总结前言复习下 ThreadLocal 的原理,因为会对 InheritableThreadLocal 的理解 有重大的帮助:每个线程都有一个 ThreadLocalMap 类型的 threadLocals 属性。ThreadLocalMap 类相当于一个Map,key 是 ThreadLocal 本身,value 就是我们的值。当我们通过 threadLocal.set(new In转载 2021-05-02 21:45:30 · 642 阅读 · 0 评论 -
Redis 分布式锁
文章目录什么是分布式锁实现锁的命令怎么释放锁代码实现分布式锁的缺陷客户端长时间阻塞导致锁失效问题Redis 服务器时钟漂移问题单点实例安全问题RedLock 算法结论什么是分布式锁说到 Redis,我们第一想到的功能就是可以缓存数据,除此之外,Redis 因为单进程、性能高的特点,它还经常被用于做分布式锁。锁我们都知道,在程序中的作用就是同步工具,保证共享资源在同一时刻只能被一个线程访问,Java 中的锁我们都很熟悉了,像synchronized 、Lock都是我们经常使用的,但是 Java 的锁只能转载 2021-04-22 18:27:09 · 237 阅读 · 0 评论 -
Mysql的MVCC
文章目录版本链trx_idroll_pointerReadViewMVCC(Mutil-Version Concurrency Control),就是多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。在Mysql的InnoDB引擎中就是指在已提交读(READ COMMITTD)和可重复读(REPEATABLE READ)这两种隔离级别下的事务对于SELECT操作会访问版本链中的记录的过程。这就使得别的事务可以修改这条记录,反正每次修改都会在版本链中记录。S转载 2021-04-20 12:37:00 · 137 阅读 · 0 评论 -
Spring中Bean的生命周期
文章目录1. 实例化Bean2. 设置对象属性(依赖注入)3. 注入Aware接口4. BeanPostProcessor5. InitializingBean与init-method6. DisposableBean和destroy-method7.各种接口方法分类对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收。而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制。Spring中每个Bean的生命周期如下:1. 实例化Bean对于BeanF转载 2021-04-17 22:04:43 · 232 阅读 · 0 评论 -
服务注册发现与注册中心对比(NACOS 和 ZK)
文章目录注册中心简介流程和原理基础流程核心功能注册中心特性对比zookeeper基础描述组件特点Nacos组件基础描述组件特点zk和nacos差异注册中心简介微服务架构中,注册中心是最核心的基础服务之一,注册中心可以看做是微服务架构中的通信中心,当一个服务去请求另一个服务时,通过注册中心可以获取该服务的状态,地址等核心信息。服务注册主要关系到三大角色:服务提供者、服务消费者、注册中心。流程和原理基础流程服务启动时,将自身的网络地址等信息注册到注册中心,注册中心记录服务注册数据。服务消费者从注转载 2021-04-12 21:49:59 · 4586 阅读 · 0 评论 -
索引使用经验
文章目录单表多表关联子查询优化order by&group by单表全值匹配我最爱,where后面有几列建复合索引。最佳左前缀法则,如果索引了多列,要遵守最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中间的列。不在索引列上做任何操作(计算、函数、(自动或手动)类型转换),会导致索引失效。where abs(a) = 12;存储引擎不能使用索引中范围条件右边的列,范围查询列放最后建索引。mysql 在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描。i原创 2021-04-04 20:32:30 · 124 阅读 · 0 评论 -
从ConcurrentHashMap的演进看Java多线程核心技术
文章目录线程不安全的HashMapHashMap工作原理HashMap数据结构HashMap寻址方式resize死循环transfer方法单线程rehash多线程并发下的rehashFast-fail产生原因线程安全解决方案Java 7基于分段锁的ConcurrentHashMap数据结构寻址方式同步方式size操作不同之处Java 8基于CAS的ConcurrentHashMap数据结构寻址方式同步方式size操作本文分析了HashMap的实现原理,以及resize可能引起死循环和Fast-fail等线转载 2021-03-26 22:14:41 · 137 阅读 · 0 评论 -
MySQL 索引结构
文章目录从一个简单的表开始页的引入排序对性能的影响基于单页模式存储的查询流程上述页模式可能带来的问题页目录的引入页的扩展多页模式多页模式对于查询效率的影响如何优化多页模式B+树的引入B+树的优势页的完整结构基于B+树聊聊MySQL的其它知识点聚簇索引和非聚簇索引联合索引的最左前缀匹配原则为什么InnoDB只有一个聚簇索引,而不将所有索引都使用聚簇索引?补充两个关于索引的点结语从一个简单的表开始create table user( id int primary key, age int,转载 2021-03-22 21:07:27 · 251 阅读 · 0 评论 -
mysql中delete和truncate区别
文章目录一、灵活性二、效率三、事务四、触发器一、灵活性delete可以条件删除数据,而truncate只能删除表的所有数据;delete from table_test where ... truncate table table_test 二、效率delete效率低于truncate,delete是一行一行地删除,truncate会重建表结构,三、事务truncate是DDL...转载 2020-04-12 12:46:12 · 1892 阅读 · 0 评论 -
java 进程,线程及状态转换
程序:一段静态的代码,一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体,是应用软件执行的蓝本。 进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命周期。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消。反映了一个程序在一定的数据 集上运行的全部动态过程。通过进程控制块(PCB)唯转载 2016-05-28 20:25:22 · 2525 阅读 · 0 评论 -
Java 线程协作 wait,notify,notifyAll,sleep,join,yield,Condition
在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。因此,一般情况下,当队列满时,会让生产者交出对临界资转载 2016-08-12 11:00:27 · 627 阅读 · 0 评论 -
JVM调优
堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。典型设置:java -Xmx3550m -Xms3550m -X...转载 2019-06-02 18:29:51 · 113 阅读 · 0 评论 -
Java 单例模式
概念 java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。 单例模式有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供这一实例。 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日转载 2016-08-16 11:40:54 · 307 阅读 · 0 评论 -
Java Map 集合类简介
HashTable和HashMap的区别相信这个是大家最容易混淆的。 HashMap和Hashtable(线程安全)都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap allow转载 2016-08-10 11:07:04 · 1505 阅读 · 0 评论 -
Java中的String、StringBuilder以及StringBuffer
文章目录String类深入理解String、StringBuffer、StringBuilderString str="hello world"和String str=new String("hello world")的区别String、StringBuffer以及StringBuilder的区别不同场景下三个类的性能测试常见的关于String、StringBuffer的面试题String类S...转载 2019-03-02 18:36:34 · 327 阅读 · 0 评论 -
Thread中start()和run()的区别
文章目录多线程原理start()run()start() 和 run()的区别说明start() 和 run()的区别示例多线程原理相当于玩游戏机,只有一个游戏机(cpu),可是有很多人要玩,于是,start是排队!等CPU选中你就是轮到你,你就run(),当CPU的运行的时间片执行完,这个线程就继续排队,等待下一次的run()。调用start()后,线程会被放到等待队列,等待CPU调度,并...转载 2019-05-26 22:27:42 · 2430 阅读 · 0 评论 -
Java ThreadPoolExecutor 线程池
概述ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线程调度,线程池管理等等服务; Executors方法提供的线程服务,都是通过参数设置来实现不同的线程池机制。 先来了解其线程池管理的机制,有助于正确使用,避免错误使用导致严重故障。同时可以根据自己的需求实现自己的线程池 核心构造方法讲解Thread转载 2016-12-25 16:07:47 · 1847 阅读 · 0 评论 -
Redis 常见面试问题
单线程的redis为什么这么快分析:这个问题其实是对redis内部机制的一个考察。其实根据博主的面试经验,很多人其实都不知道redis是单线程工作模型。回答:主要是以下三点(一)纯内存操作(二)单线程操作,避免了频繁的上下文切换(三)采用了非阻塞I/O多路复用机制经营方式一客户每送来一份快递,小曲就让一个快递员盯着,然后快递员开车去送快递。慢慢的小曲就发现了这种经营方式存在下述问题...转载 2019-02-25 22:32:29 · 199 阅读 · 0 评论 -
5种IO模型
文章目录概念5种IO模型1. A Story2. 5种IO模型1. 阻塞IO2.非阻塞IO3. IO复用/多路转接IO4. 信号驱动IO5. 异步IO3. 区别与联系为什么epoll,kqueue比select高级?概念IO叫做输入输出,我们可以将IO理解为两步:等待IO事件就绪数据就绪后进行真正意义上的IO(真正的数据搬迁)所以,IO的过程一是等,然后才是输入输出。进而,我们可以...转载 2019-05-18 22:29:37 · 230 阅读 · 0 评论 -
分布式锁的几种使用方式(redis、zookeeper、数据库)
问题Q:一个业务服务器,一个数据库,操作:查询用户当前余额,扣除当前余额的3%作为手续费synchronizedlockdb lockQ:两个业务服务器,一个数据库,操作:查询用户当前余额,扣除当前余额的3%作为手续费分布式锁我们需要怎么样的分布式锁?可以保证在分布式部署的应用集群中,同一个方法在同一时间只能被一台机器上的一个线程执行。这把锁要是一把可重入锁(避免死锁)这把锁...转载 2019-04-06 16:23:01 · 493 阅读 · 0 评论 -
HashMap,ConcurrentHashMap常见问题
文章目录原理Put方法的原理Get方法的原理HashMap默认初始长度并发情况下死锁java8对hashMap做了什么优化原理众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。HashMap数组每一个元素的初始值都是Null。对于HashMap,我们最常使...转载 2019-02-23 18:55:34 · 2358 阅读 · 2 评论