自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ThreadLocal

4、spring mvc中的httpSession、httpServletRequest、HttpServletResponse都是放在ThreadLocal中,因为Servlet是单例的,而spring mvc允许在controller类中通过@Autowird配置request、response以及requestcontext等实例对象。2、隔离线程,存储一些线程不安全的工具对象,比如simpleDateFormat。3、spring中的事务管理器就是用的threadLocal。

2024-05-16 18:29:07 183

原创 timestamp和datetime的区别

第一,timestamp还是datetime在任意一种sql中都不可能存储的字符串,而是存储的时间点,不同的是datetime存储的是5个byte,而力度是毫秒。而timestamp存储的是时间戳,即数字0等于1970.1.1号,1970以前的时间用负数,以后的时间用正数,最小力度是秒,是一个32bit 4字节长度的int,有符号整形。第二,timestamp的范围肯定不是1970起始,因为负数也可以表示时间。timestamp可以设置默认值和自动更新值,并会记录变更的时间。可以表示更广范围的日期和时间。

2024-05-11 13:39:39 787

原创 常用设计模式

设计模式分三种:创建型、结构型、行为型。

2024-05-10 22:57:08 625 1

原创 ReentrantLock的原理

Sync:抽象类,是 ReentrantLock 的内部类,继承自 AQS,实现了释放锁的操作(tryRelease()方法),并提供了 lock 抽象方法,由其子类实现。Sync:抽象类,是 ReentrantLock 的内部类,继承自 AQS,实现了释放锁的操作(tryRelease()方法),并提供了 lock 抽象方法,由其子类实现。当为公平锁时,与非公平锁的主要区别在于公平锁在执行 tryAcquire 时,需要加一个判断(当前节点是否还有其他节点),如果有其它节点则将自身添加到队列中等待唤醒;

2024-05-09 14:44:39 308

原创 0507华为od二面

Java 核心类库(如 java.lang 包下的类)都是由启动类加载器加载的,其他的类都是由其它类加载器加载的。这样,我们就可以保证 Java 核心类库的安全性,因为不同的应用程序无法改变这些类的实现。如果使用了双亲委派机制,就可以保证不同的类加载器只会加载自己的类,从而避免了类名冲突的问题。如果以后有新的键值(一个或多个)加进这个数据块,则块中标记删除的键值都会清除。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。4)分代的原因:不同对象的生命周期不相同,可能会扫描整个堆。

2024-05-07 23:11:35 440 1

原创 为什么mysql索引b+树达到四层查询就变慢

mysql查询先去自己内存的buffer pool里查,buffer pool里面没有才去走索引查询,四层的缓存命中率低于三层。三层和四层之间就差一次io,其实差别不大,差别是在buffer pool。buffer pool默认大小是128MB。真正的差距在走缓存和走随机io。

2024-05-05 20:42:37 341

原创 CPU99%排查问题

根据2.3.3获取到的PID对应的16进制数据5bcd,从2.3.4步获取的stack.log中查找对应的线程信息,根据具体信息分析占用CPU的原因。4、使用下面命令获取java进程326的jstack信息,并存储到stack.log文件。如果获取到的线程是GC task开头,表示该线程是垃圾回收线程,说明在频繁GC。使用下面命令将上一步获取到的10进制数23501转换为16进制,得到5bcd。通过下面命令观察占用CPU最多的线程PID。5、获取占用CPU最高线程具体信息。3、PID转换为16进制数据。

2024-05-02 18:29:48 441

原创 限流的学习

限流算法:滑动窗口算法滑动日志算法漏桶算法令牌桶算法。

2024-05-01 21:12:48 550 1

原创 主从同步延迟较高如何解决?

如果确实是存在必须先插入,立马要求就查询到,然后立马就要反过来执行一些操作,对这个查询设置直连主库或者延迟查询。主从复制延迟一般不会超过50ms。分库,拆分为多个主库,每个主库的写并发就减少了几倍,主从延迟可以忽略不计。重写代码,写代码的同学,要慎重,插入数据时立马查询可能查不到。

2024-04-30 18:47:25 198

原创 深分页问题

此处我们就可以采用覆盖索引+延迟关联技术来减少偏移量的定位进行优化:##查询语句##优化方式一##优化方式二。

2024-04-29 21:55:28 140

原创 redission原理笔记

每次设置锁只会往一个节点设置锁,redis内部进行同步。这个问题看可以通过redLock来解决,针对redis当中所有节点进行同步,所有节点存储完毕才会返回成功。如果redis是主从同步的,redisson只能保证高可用和高性能,不能保证高一致性。加锁成功后,内部有一个看门狗机制,每隔十秒看下当前线程是否还持有锁,延长生存时间。加锁成功的线程,将UUID和线程id和key绑定,没有获取锁的就一直自旋等待,直到超时。

2024-04-27 22:20:43 387 1

原创 having和where的区别

4.WHERE 针对数据库文件进行过滤,而 HAVING 针对查询结果进行过滤。也就是说,WHERE 根据数据表中的字段直接进行过滤,而 HAVING 是根据前面已经查询出的字段进行过滤。2.WHERE 查询条件中不可以使用聚合函数,而 HAVING 查询条件中可以使用聚合函数。5.WHERE 查询条件中不可以使用字段别名,而 HAVING 查询条件中可以使用字段别名。3.WHERE 在数据分组前进行过滤,而 HAVING 在数据分组后进行过滤。

2024-04-27 16:26:45 315

原创 java中数组和arraylist的区别

arraylist底层也是一个数组,不过是动态的。扩容:当数组满时,它会创建一个空间比原空间大0.5倍的新数组,并将现有元素复制到新数组中。最近在面试,被问到java中数组和arraylist的区别,很久没被问过基础面试题了。

2024-04-27 00:06:06 116

原创 锁 synchronized和lock

当方法调用时, 调用指 令将会 检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置, 如果设置了, 执行线 程将先持有 monitor (虚拟机规范中用的是管程一词), 然后再执行方法, 最后再方 法完成(无论是正常完成还是非正常完成)时释放 monitor。当锁计数器为 0 时, 该锁就被释放 了。1.Lock 的加锁和解锁都是由 java 代码配合 native 方法 (调用操作系统的相关方 法) 实现的, 而 synchronize 的加锁和解锁的过程是由 JVM 管理的。

2024-04-25 12:39:34 436

原创 Atomic类

UnSafe 类的 objectFieldOffset() 方法是个本地方法, 这个方法是用来拿“原值”的 内存地址, 返回值是 valueOffset;另外, value 是一个 volatile 变量, 因此 JVM 总是可以保证任意时刻的任何线程总能拿到该变量的最新值。CAS 的原理, 是拿期望值和原本的值作比较, 如果相同, 则更新成新的值。

2024-04-25 12:37:12 258

原创 ClassNotFoundException NoClassDefFoundError 异常的区别以及产生的原因

ClassNotFoundException和NoClassDefFoundError都表示类没有被找到,但它们的原因不同。ClassNotFoundException表示Java虚拟机在运行时找不到某个类,而NoClassDefFoundError表示Java虚拟机在运行时找到了某个类的定义文件,但无法正确地加载它。

2024-04-25 12:22:16 167

原创 sleep和wait的区别

sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。4、sleep必须捕获异常throws InterruptedException,而wait,notify和notifyAll不需要捕获异常。3、使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。1、sleep来自Thread类,和wait来自Object类。

2024-04-25 12:02:28 324

原创 使用Redis实现延时队列

延时队列相比于普通队列最大的区别就体现在其延时的属性上,普通队列的元素是先进先出,按入队顺序进行处理,而延时队列中的元素在入队时会指定一个延迟时间,表示其希望能够在经过该指定时间后处理。从某种意义上来讲,延迟队列的结构并不像一个队列,而更像是一种以时间为权重的有序堆结构。可以看到生产者很简单,其实就是利用zset的特性,给一个zset添加元素而已,而时间就是它的score。消费者的代码也不难,就是把已经过期的zset中的元素给删除掉,然后处理数据。redis的zset实现延迟队列。

2024-04-25 11:37:59 567

原创 未加@transational注解的A方法调用加了@transational的B方法 ,事务会生效吗

然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么该方法的调用并没有通过代理类,而是直接通过原来的那个bean,所以就不会启动transaction,我们看到的现象就是@Transactional注解无效。我们调用的方法A不带注解,因此代理类不开事务,而是直接调用目标对象的方法。当进入目标对象的方法后,执行的上下文已经变成目标对象本身了,因为目标对象的代码是我们自己写的,和事务没有半毛钱关系,此时你再调用带注解的方法,照样没有事务,只是一个普通的方法调用而已。

2024-04-25 11:19:39 391 1

原创 inner join和left join哪个效率更高

①大家都知道,sql尽量使用数据量小的表做主表,这样效率高,如果使用数据量大的表做主表,此时使用left join 就会比较慢,即使关联条件有索引。②选择inner join还有个好处,不会产生null,有些表我们在定义的时候某些字段不允许存在null,如果用left join就可能会产生null,此时软件就会报错,而inner join可以避免。③在实际运用中选择inner join还是left join这个需要根据实际场景进行选择,并不是所有的地方都能用inner join的,建议能用则用。

2024-04-25 11:01:59 1922

原创 一条sql发送给mysql后,内部是如何执行的?(说一下 MySQL 执行一条查询语句的内部执行过程?)

1、mysql在接受到一条查询时,如果开启了查询缓存,会先从查询缓存里取,没有的话进入下一步2、进入解析阶段,解析器会通过关键字将sql解析成一颗解析树,这里会进行词法和语法的解析。之后预处理器会将解析树进一步分析,检查数据表和列是否存在,最后预解析器会生产一颗新的解析树,并将解析结果传给执行优化器。3、执行优化器会将解析树转换成一个执行计划,这里会对语句做一些优化,比如子查询转换成连接查询。这个执行计划里会声明用哪些索引,,可以使用explain查看。

2024-04-19 23:15:22 461 1

原创 synchronized锁升级原理

轻量级锁就是线程在占有锁的时候,将锁对象的对象头复制一份到自己的栈帧中,然后使用CAS将锁对象头里的内容换成栈帧的地址。当一个线程获取锁时,会从锁对象的对象头立获取线程id和自己比较,如果是一致,就直接加锁,偏向锁它是适用于一个线程多次获得同一个锁的情况。synchronized锁有四种状态,无锁,偏向锁,轻量级锁,重量级锁,这几个状态会随着竞争状态逐渐升级,锁可以升级但不能降级,但是偏向锁状态可以被重置为无锁状态。升级成重量级锁之后,重量级锁会把除了拥有锁的线程都阻塞掉,防止CPU空转。

2024-04-19 23:04:40 391

原创 四种引用-面试

虚引用:对象回收跟踪(一个对象是否有虚引用存在,不会决定对象的生命周期,就相当于没有引用。软引用:内存不足立即回收。

2024-04-19 22:32:18 118

原创 Java类加载

实现:接口定义在启动类加载器中,实现类定义在其他类加载器,当启动类加载器需要加载其他子类加载器路径中的类,class文件加载到内存,再到类卸载出内存会经历7个阶段:加载、验证、准备、解析、初始化、使用、和卸载。类加载器接到加载类的请求,就委托给父类进行加载,父类加载不了才自己加载。可见性:子类可以访问父类加载的类,父类不能访问子类的。3、线程上下文类加载器,能够让父类调用子类进行加载。双亲委派模型:找父类加载,父类加载不了再自己加载。缺点:父类无法加载子类的类。优点:可以避免重复加载。

2024-04-15 16:04:56 284

原创 mysql面试

是innodb的一个特殊功能,当某些索引值被使用地非常频繁,会在内存中,基于B-tree之上再创建一个哈希索引,这是一个完全自动的内部行为,用户无法控制。

2024-04-13 20:44:26 775

原创 多线程面试准备

CAS的优势在于它没有阻塞状态,不会引起线程上下文的切换和调度问题。如果大于等于,判断等待队列是否满,如果满了,线程数是否小于最大线程数,是->创建新线程执行任务,不是则拒绝。WorkStealingPool:工作窃取线程池,Java8引入的一种线程池,每个线程维护自己的任务,可以窃取别的线程队列中的任务。FixedThreadPool:固定大小的线程池,核心线程数和最大线程数相同,适用于任务量可控、并发量不是很大的场景。6、线程工厂:新建线程,可以设置线程的优先级、线程名、线程类型用户线程/守护线程等。

2024-04-13 20:31:53 289

原创 rocketmq面试

4、Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。具体流程是,消息写入内存的PAGECACHE后,立刻通知刷盘线程刷盘, 然后等待刷盘完成,刷盘线程执行完成后唤醒等待的线程,返回消息写成功的状态。异步刷盘:在返回写成功状态时,消息可能只是被写入了内存的PAGECACHE,写操作的返回快,吞吐量大;

2024-04-13 20:29:11 691

原创 Redis面试

先更新mysql,如果删除redis失败,将删除操作发送到mq,过一会再删除,重试删除操作。可预知的:凭借业务经验,进行预估哪些是热key,通过批量加载和预先访问热门数据,将热key提前加载到内存中。启动时,哨兵会选举出一个主节点,每个哨兵节点向其他节点发出命令,当票数大于一半时就成为领导者。节点监控,发送命令周期性的检查主从节点的状态,如果发现主节点不可用,触发一次故障转移。monitor 哨兵进程,监控主节点和从节点的情况,并通知其他哨兵进程。如果数据库也没有的数据,在缓存做一个空的值,防止缓存穿透。

2024-04-13 19:45:12 573

原创 Dubbo面试回答简单版

调用之前生成的代理类,从cluster中经过负载均衡等选择一个invoker进行调用,会记录请求和请求id,服务端根据参数选择exporter,调用真正的实现类,得到结果后,根据请求id将结果放到等待的线程中,消费者最后得到响应。每次发起调用时,都会按照本地的地址列表,以负载均衡的策略去进行调用。注册中心之间保持TCP长连接,后续每个节点有任何数据变化的时候,注册中心会根据watcher的回调主动通知客户端(事件通知),客户端接到通知后,会把对应节点下的全量数据都拉取过。它可以把我们对接口的配置,

2024-04-13 17:17:11 1019

原创 Spring AOP IOC

BeanFactory是Spring里面最底层的接口,是IoC的核心,定义了IoC的基本功能,包含了各种Bean的定义、加载、实例化,依赖注入和生命周期管理。**概念:**依赖控制反转,在IOC之前,一个对象要引入另一个对象就要自己new,用完之后也要自己释放,对象之间耦合较深,出现IOC之后,由spring来控制对象注入,引用对象只需要用就可以了,不需要再管理注入对象的生命周期。在内存中生成一个aop对象,包含原对象的所有方法,并在切点执行完成后调用原对象的方法。**DI:**依赖注入。

2024-04-13 17:11:06 892 1

原创 Map相关面试答案(都是简单版

1、继承2、红黑树实现,返回有序的key3、在创建时需要提供comparator来排序。

2024-04-12 23:18:08 503

原创 慢查询的处理

经常用在where、order by、分组、连接的、更改少的、1、先用explain看下。2.2 如何选择索引。

2024-04-12 20:26:48 148

原创 OOM的处理流程

jmap: JVM memory map 生产jvm的内存转储快照、生产heapdump文件 查询finalize执行队列。jstat:JVM statistics monnitoring 查看jvm各方面的运行数据 可以看堆的容量和已使用空间。使用jps和 jstat -gcutil 156 1000 10 命令查看 刚重启后与即将OOM的机器GC情况。dump OOM前堆快照,查看当前存在哪些大对象(实例数量最多,占用内存空间比例最大的),找到大对象引用。第一种会突然变多,第二种是缓慢增加的,

2024-04-12 20:15:06 241

原创 ZGC的介绍

ZGC中取消了分代的设计,并将内存空间按页面的形式来分,ZGC的垃圾回收线程和业务线程同时运行,ZGC是一个高度并发的垃圾回收器,多个线程进行回收,只有短暂的STW同步暂停。在ZGC中使用了标记-复制算法。ZGC 周期由三个 STW 暂停和四个并发阶段组成:标记/重新映射( M/R )、并发引用处理( RP )、并发转移准备( EC ) 和并发转移( RE )ZGC只有三个阶段是STW的,其他阶段完全并发。

2024-04-12 19:06:09 447

原创 策略模式、模板模式、观察者模式

其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。写一个接口,然后写多个类继承这个接口,每个类实现不同的逻辑,用一个context来放会用到的参数,。提供一个模板,将公共逻辑写到模板类里,将其中需要不同实现的方法拆出来定义,让子类去实现。其主要目的是通过定义相似的算法,替换if else 语句写法,并且可以随时相互替换。

2024-04-12 17:05:58 416

原创 接口优化思想

一是我使用了预取、异步、批量、远程调用并行、空间换时间、池化、在正式执行判断逻辑前,先将每个订单的订单信息、用户信息、历史信息、以及远程调用其他系统的信息全部通过线程池多线程异步调用,预先准备好,缓存在map里。我需要做一个展示页面,这个页面涉及的订单号特别多,每个订单号都要查询订单信息,并且需要展示多条内容,每条内容都要拼接并判断逻辑。但是将查询的从主库改成从库,这只是一个查询的接口没必要用主库。查其他系统每次接口的耗时是p99,每个订单都要调用一次。2、异步:耗时操作放到异步执行。

2024-04-12 15:33:10 219

原创 spring的事件推送

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。在 Spring 的事件机制中,我们可以令一个事件类继承 ApplicationEvent 类,然后将实现了 ApplicationListener 的 Bean 注册到 spring 容器,最后向 ApplicationEventPublisher 推送事件对象即可令所有订阅者收到事件。

2024-04-12 15:20:48 384 1

原创 dubbo2和dubbo3区别

dubbo3:beanName根据当前添加的beanDefinition class,再加上“#编号”,如 org.apache.dubbo.config.spring.ServiceBean#0、org.apache.dubbo.config.spring.ServiceBean#1。“reference bean id不同,接口相同,registry不同” 场景下, 只订阅了一个registry的服务,原因是。找到的prevConfig相同(地址相同,或除了id意外的其它属性值均相同),则返回。

2024-04-12 14:14:37 1665

原创 jdk8升级到jdk17

jdk8新特性:1、lambda表达式2、引入了stream api3、函数式接口4、方法引用 ::5、hashmap实现的增强6、Optional类7、对时间、日期的优化,新增了LocalDate、LocalTime、LocalDateTime,打印输入时比date友好。5、并发增强:JDK 8对并发编程进行了增强。它引入了一些新的并发工具和类,使得并发编程更加容易和有效。其中包括CompletableFuture类、StampedLock类、并行数组等。

2024-04-11 20:29:04 990

原创 单例模式的双重检查锁

过了第一层检查后就进入synchronized,同步代码块,在同步代码块中再次检查,防止有多个线程同时进入同步代码块。实例变量需要用volatile修饰,这样多个线程才能看见。第一层检查是判断实例是否已经被创建。

2024-04-11 17:54:58 635

空空如也

空空如也

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

TA关注的人

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