【面试精选】
文章平均质量分 90
青山师
编码、架构、程序人生;此博客输出内容永久免费,长期分享JAVA开发技术
展开
-
微服务服务间调用组件Feign使用介绍、原理、优化技巧
Feign是一个声明式的Web Service客户端。它让微服务之间的调用变得更简单。Feign具有可插拔式的注解支持,包括Feign 注解和JAX-RS注解。Feign还支持可插拔的编码器和解码器。Spring Cloud增加了对Spring MVC注解的支持,并且也支持Spring WebFlux。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。Feign的基本概念、原理与使用。Feign采用声明式的接口,自动拼接URL、添加参数等工作,简化HTTP客户端的开发。原创 2023-05-20 15:51:28 · 1246 阅读 · 0 评论 -
微服务负载均衡器Ribbon介绍、使用以及原理和源码理解
Ribbon是Netflix开源的客户端负载均衡器,它可以很好的控制HTTP和TCP客户端的行为。Ribbon支持配置客户端添加重试和超时等功能,旨在使客户端更加强健。负载均衡故障检测暂时性错误重试客户端配置化等轮询(RoundRobinRule):轮流选择服务器随机(RandomRule):随机选择服务器重试(RetryRule):在一个配置时间内当选择服务器不成功,则一直尝试该服务器,超过配置时间才尝试其他服务器。原创 2023-05-17 23:23:16 · 1554 阅读 · 0 评论 -
微服务注册中心Eureka原理到源码
Eureka是Netflix开源的一款用于提供服务注册和发现的产品,它提供了完整的服务注册和发现功能,具有容错性,可伸缩性等特性。Eureka包含两个组件:Eureka Server和Eureka Client。Eureka Server提供服务注册服务。各个微服务启动时,会通过Eureka Client向Eureka Server注册自己的信息(例如服务名称、IP地址、端口等)。原创 2023-05-15 18:31:03 · 968 阅读 · 0 评论 -
JVM问题排查和垃圾回收机制
JVM的主要内存区有方法区、堆、栈、程序计数器等,堆和方法区是所有线程共享的,其中堆主要用于存储对象实例,是一个显著的可回收内存来源。垃圾回收器的主要工作就是规律的遍历堆区,释放那些不再被使用的对象所占用的内存,使其成为可用内存。其中,[标记-清除]算法会产生内存碎片较严重,而[标记-复制]算法需要双倍的内存空间,所以目前主流的商业虚拟机一般采用[标记-整理]算法。Java垃圾回收主要是利用垃圾回收器对堆内存进行回收,回收那些不再被使用的对象所占用的内存,以实现内存的再利用。原创 2023-05-12 19:44:15 · 936 阅读 · 0 评论 -
线程池的介绍、原理、监控运维、框架使用场景案例
JDK 提供的线程池功能较基础,开源框架 Executors 在此基础上做了许多封装,更加易用。主要有:- newCachedThreadPool:创建一个可缓存的线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。- newFixedThreadPool: 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。- newScheduledThreadPool: 创建一个定长线程池,支持定时及周期性任务执行。- newSingleThreadExecuto原创 2023-05-03 20:19:47 · 1176 阅读 · 0 评论 -
synchronized的偏向、轻量、重量级锁
Synchronized实现同步的方式有三种:偏向锁、轻量级锁、重量级锁。本文会从理论和代码实践两方面阐述三种锁的实现细节和原理。原创 2023-05-02 22:47:16 · 1007 阅读 · 1 评论 -
JAVA并发万字长文从ReentrantLock到juc框架
ReentrantLock 是通过一个volatile 的变量和一个 FIFO 的队列来实现的。该 volatile 变量表示当前获得锁的线程,FIFO 队列用来存储等待锁的线程。具体实现方式是:当一个线程获取锁时,将当前线程设置为 volatile 变量的值。如果其他线程试图获取该锁,则会加入 FIFO 队列的尾部,并标记为等待状态。当持有锁的线程释放锁时,它会唤醒 FIFO 队列头部的线程,这个线程继续执行并获取锁。ReentrantLock 是可重入锁,意味着同一个线程可以多次获取这把锁。这是原创 2023-05-02 20:53:28 · 1025 阅读 · 0 评论 -
volatile关键字原理的使用介绍和底层原理解析和使用实例
volatile 关键字的主要作用是保证可见性和有序性,禁止编译器优化。保证可见性:当一个变量被声明为 volatile 之后,每次读取这个变量的值都会从主内存中读取,而不是从缓存中读取,这就保证了不同线程对这个变量操作的可见性。有序性:volatile 关键字保证了不同线程对一个 volatile 变量的读写操作的有序性。禁止编译器优化:编译器会对代码进行各种优化来提高性能,但是这些优化也可能让同步代码失效。volatile 关键字告诉编译器不要对这段代码做优化,从而避免一些不正确的优化。原创 2023-05-02 17:11:46 · 1475 阅读 · 0 评论 -
ThreadLocal的使用介绍和底层原理解析和开源框架的使用实例
ThreadLocal是一个线程内部的数据存储类,它可以为每个线程提供独立的变量副本,不同线程间的变量无法相互访问和修改。这避免了每个线程都要维护一套独立变量的麻烦,并且也减少了线程之间不必要的数据争用。ThreadLocal适用于这样的场景:每个线程需要有自己单独的实例,而不是共享实例。例如,在 web 应用中,每个请求被一个新的线程处理,每个线程需要有自己的变量实例。原创 2023-05-02 15:07:43 · 1903 阅读 · 0 评论 -
ConcurrentHashMap的使用介绍和底层原理解析和开源框架的使用实例
ConcurrentHashMap是JDK1.5提供的线程安全的HashMap,它允许多个线程并发访问哈希表,并发修改map中的数据而不会产生死锁。ConcurrentHashMap适用于高并发的环境下,可以替代synchronized实现的同步HashMap。ConcurrentHashMap的并发度很高,吞吐量也很高。ConcurrentHashMap通过锁分段技术,实现高度的并发访问,大大提高了HashMap的吞吐量,是高并发环境下一个很好的选择。原创 2023-05-01 23:01:50 · 1400 阅读 · 0 评论 -
【面试长文】HashMap的数据结构和底层原理以及在JDK1.6、1.7和JDK8中的演变差异
JDK1.8引入了红黑树,降低了链表过长的可能性,提高了效率。JDK1.8使用synchronized+CAS控制并发扩容,避免锁定整个table,提高了并发度。JDK1.8对null key做了优化,null键值对存储在table[0]位置。三个版本的HashMap都采用链表散列结构,通过key的hashCode映射到table,如果hash冲突就采用链表存储。扩容的阈值loadFactor在三个版本都是0.75,阈值size和table大小的乘积超过loadFactor时触发扩容。原创 2023-04-30 13:51:09 · 1203 阅读 · 0 评论 -
CopyOnWriteArrayList 的底层原理与多线程注意事项
CopyOnWriteArrayList 是 Java 集合框架中非常实用的线程安全 List 集合,通过读写分离的思想,保证了在高并发读多写少的情况下的数据安全和性能。但是,由于每次写操作需要复制整个数组,所以对内存的消耗较大,同时在迭代过程中也可能会存在一些数据不一致的问题。因此,在使用 CopyOnWriteArrayList 时,需要根据实际业务需求选择合适的集合类型,避免出现不必要的问题。原创 2023-04-30 11:46:23 · 2439 阅读 · 1 评论 -
Java集合框架与ArrayList、LinkedList的区别
在集合框架中,ArrayList和LinkedList是两个最基本的数据结构。LinkedList是一个双向链表,表示一个有序的集合,可以包含重复的元素。ArrayList是一个动态数组,表示一个有序的集合,可以包含重复的元素。Java集合框架是Java平台的一部分,它包含了一组接口、实现类和算法,可以用于存储和处理数据。下面给出一个使用 ArrayList 和 LinkedList 的示例代码,包括元素的插入、删除和访问操作。Java集合框架提供了丰富的算法和数据结构,可以满足各种不同的需求。原创 2023-04-30 11:29:21 · 2009 阅读 · 0 评论 -
Java中的String、StringBuffer和StringBuilder
String、StringBuffer 和 StringBuilder 都是处理字符串的类型,但是它们之间有很大的不同。String 是不可变的,而 StringBuffer 和 StringBuilder 是可变的。StringBuffer 和 StringBuilder 类似,但是 StringBuffer 是线程安全的,而 StringBuilder 不是。如果你需要对字符串进行频繁的修改操作,并且在多线程环境中使用,那么就应该使用 StringBuffer;原创 2023-04-30 11:16:45 · 1147 阅读 · 0 评论 -
消息队列如何保证消息可靠性传输
在本文中,我们主要介绍了持久化存储、消息确认机制、重试机制和幂等性处理等机制,以及使用 JAVA 语言和 Apache Kafka、RabbitMQ 进行代码实践的示例。通过上述机制的支持和实践,可以保证消息队列系统的可靠性和稳定性,为各大互联网公司提供高效、稳定的消息传输服务。原创 2023-04-30 11:07:56 · 3097 阅读 · 0 评论 -
RocketMQ 底层实现原理
在 RocketMQ 中,消息的发送过程可以分为三个步骤:1. 生产者发送消息到 Broker;2. Broker 将消息存储到磁盘,并将消息持久化到 CommitLog 和 IndexFile 中;3. 消费者从 Broker 拉取消息并进行消费。原创 2023-04-30 10:59:16 · 2558 阅读 · 0 评论 -
kafka的push、pull分别有什么优缺点
在 Kafka 中,生产者使用 push 模式将消息推送给 Kafka 集群,而消费者则使用 pull 模式从 Kafka 集群中拉取消息。本文对 Kafka 的 push 和 pull 两种模式进行比较,分析其优缺点。Pull 模式是 Kafka 新增的方式,使用该模式时,消费者可以自主选择从哪个分区开始拉取消息,并可以自主控制拉取消息的速度。Kafka 中为消费者维护着一个 offset,表示消费者已经消费的消息序号,当消费者拉取消息时,Kafka 会返回该消费者还没有消费的消息。原创 2023-04-29 15:58:33 · 3278 阅读 · 1 评论 -
InnoDB如何实现事务、undo log、redo log、binlog
当一个事务开始后,会在内存中为其分配一块undo log,并在该事务执行修改数据表之前将相关数据先拷贝到undo log中。同时,InnoDB还利用了多版本并发控制(MVCC)来实现数据的隔离性。主从复制时,从库会读取主库的binlog事件来重放数据的更改,实现数据一致性。redo log是指数据库系统执行修改操作时所记录的日志,它的主要作用是确保当数据库崩溃时不会丢失数据更新操作。InnoDB是MySQL的默认存储引擎,它使用多版本并发控制(MVCC)和锁机制来实现事务。原创 2023-04-26 15:31:43 · 828 阅读 · 0 评论 -
B树、B+树的区别及MySQL为何选择B+树
B树和B+树都是一种多路搜索树,常用于数据库和文件系统中进行索引操作。在介绍B树和B+树的区别之前,先来了解一下它们的定义。原创 2023-04-26 14:44:37 · 1104 阅读 · 0 评论 -
MySQL存储引擎InnoDB、MyISAM和MEMORY介绍详解和区别
MySQL是目前使用最广泛的关系型数据库,而存储引擎是MySQL中一个非常重要的概念。存储引擎决定了MySQL如何存储和处理数据,对于系统性能和功能的影响非常大。本文将对MySQL常见的几种存储引擎进行介绍和比较,帮助读者更好地选择适合自己应用场景的存储引擎。不同的存储引擎有不同的特点和适用场景,我们可以根据实际需求选择最合适的存储引擎。一般来说,应该优先考虑使用InnoDB存储引擎,因为它支持事务、行级锁定等高级功能,能够保证数据的一致性和可靠性。原创 2023-04-23 15:16:29 · 1254 阅读 · 0 评论 -
MySQL索引B+树、执行计划explain、索引覆盖最左匹配、慢查询问题
B+树以(m, M)-B+树的形式出现,其中m和M的含义与B树相同,但内部节点包含的关键字数目比B树更多,通常是M/2到M。B树是一种平衡多路查找树,相比于二叉查找树,它允许一个节点存在多个子节点,因此可以减少I/O操作的次数,提高数据的访问效率。B树中的每个节点都可能存储关键字,因此,除了叶子节点,B树的每个节点都可以作为查询结果返回。B树的非叶子节点存储关键字以及指向子节点的指针,而B+树中的非叶子节点只存储关键字和对应子节点的指针,即只存储索引信息,这样可以存储更多的索引信息。原创 2023-04-20 20:35:06 · 681 阅读 · 0 评论 -
HashMap的关键性源代码进行解读
对于相同的键,hashCode()方法返回的哈希值是相同的,但是对于不同的键,哈希值不一定不同,因此在映射到数组下标位置时可能会出现冲突。下面我将结合HashMap的源码,深入讲解HashMap的实现细节和背后的实现原理。需要注意的是,扩容是一项比较耗费性能的操作,所以如果可以预测 HashMap 的元素数量,应该在创建 HashMap 时设置其初始容量,避免在后续使用过程中频繁扩容。先通过哈希函数计算键的哈希值,然后找到对应桶中的链表(或红黑树),再逐一遍历链表(或查找红黑树),直到找到对应的键值对。原创 2023-04-13 20:19:53 · 612 阅读 · 0 评论 -
从BIO到NIO、AIO和零拷贝
在BIO模型中,所有的I/O操作都是阻塞的,也就是说,当一个线程调用read()或write()时,该线程会被阻塞,直到有数据可读或写入成功。AIO(Asynchronous I/O)异步I/O模型是在NIO模型的基础上又做了一些改进,它将I/O操作的具体实现委托给内核,直接由内核进行读写操作,当数据读写完成后再回调到应用层,这样就不需要像BIO、NIO模型那样由用户线程进行数据读取和写入,从而减少了系统调用的次数,充分利用了系统的资源。零拷贝技术指避免CPU从应用缓冲区向内核缓冲区拷贝数据的一种技术。原创 2023-04-11 23:33:09 · 666 阅读 · 0 评论 -
SpringBoot常见的的面试点
SpringBoot是Spring框架的一个子项目,它可以让开发者更快速、更容易地创建基于Spring的应用程序。SpringBoot通过提供默认的配置和自动化配置来简化Spring应用程序的开发过程,并提供了一系列插件和工具来简化构建、测试和部署Spring应用程序的流程。相对于传统的Spring框架,SpringBoot更加轻量级,启动更快,编写更少的代码就能实现同样的功能。原创 2023-04-09 19:01:08 · 463 阅读 · 0 评论 -
生产环境常见的限流算法
在高并发场景下,为了保护系统的稳定性和可用性,需要对请求进行限流。本文介绍几种生产环境中常见的限流算法,并结合Java代码实现。原创 2023-04-06 20:34:52 · 544 阅读 · 0 评论 -
JAVA面试八股文
文章目录**面试八股文**· **MyBatis**· **分布式**· **IO**· **Redis**· **MySQL**· **MQ**· **基础**· **JVM**· **类加载**· **WEB**· **Spring**· **SpringBoot**· **网络**面试八股文· MyBatiso mybatis的优缺点o #{}与${}的区别· 分布式o CAPo BASEo RPCo 分布式ID是什么?有哪些解决方案o 分布式锁有哪些解决方案?o 分布式事务、哪原创 2021-09-22 12:49:24 · 2488 阅读 · 0 评论 -
Java结合方法栈帧理解递归编程思想
文章目录Java结合方法栈帧理解递归编程思想递归的介绍阶乘——递归入门案例递归和方法栈尾递归优化汉诺塔实现Java结合方法栈帧理解递归编程思想递归的介绍In computer programming, the term recursive describes a function or method that repeatedly calculates a smaller part of ...原创 2020-04-10 20:51:19 · 976 阅读 · 0 评论 -
生产者-消费者模式的多种实现
文章目录生产者-消费者模式的多种实现1. 生产者-消费者模式介绍2. 考核技术点2.1 线程间通信的知识点2.1.1 wait-notify2.1.2 JDK的阻塞队列BlockingQueue2.1.2 条件信号3. 多种实现方式3.1 JDK自带的BlockingQueue实现3.2 synchronized+wait+notifyAll实现3.3 ReentrantLock+Conditio...原创 2020-03-26 17:49:21 · 490 阅读 · 0 评论 -
聊一聊线程安全、Java中的锁
聊一聊Java中的锁当进行多线程编程的时候,可能争抢同一资源而引发不安全的问题。多个线程访问方法、某个实例对象出现问题——线程安全问题。如果一次仅仅允许一个线程操作使用就不会发生问题,对于这种资源称之为临界资源。线程安全线程安全是多线程场景下才会产生的问题,线程安全可以理解为某个方法或者实例对象在多线程环境中使用而不会出现问题。那么怎么解决线程安全问题呢?线程安全解决方式Java提...原创 2020-03-26 23:42:25 · 397 阅读 · 0 评论