前言ThreadLocal翻译成中文是线程本地变量的意思,也就是说它是线程中的私有变量,每个线程只能操作自己的私有变量,所以不会造成线程不安全的问题。所谓的线程不安全是指,多个线程在同一时刻对同一个全局变量做写操作时(读操作不会涉及线程不安全问题),如果执行的结果和我们预期的结果不一致就称之为线程不安全,反之,则称为线程安全。在Java语言中解决线程不安全的问题通常有两种手段:使用锁(使用synchronized或Lock)...
2023-11-17 11:18:38 2137浏览 0点赞 0回复 0收藏
在海量数据如何确定一个值是否存在?这是一道非常经典的面试场景题。那怎么回答这个问题呢?接下来咱们就详细的聊一聊。参考答案判断一个值是否存在?通常有以下两种解决方案:使用哈希表:可以将数据进行哈希操作,将数据存储在相应的桶中。查询时,根据哈希值定位到对应的桶,然后在桶内进行查找。这种方法的时间复杂度为O(1),但需要额外的存储空间来存储哈希表。如果桶中存在数据,则说明此值已存在,否则说明未存在。使用...
2023-11-17 11:18:13 1896浏览 0点赞 0回复 0收藏
在SpringBoot中,拦截器和动态代理都是用来实现功能增强的,所以在很多时候,有人会认为拦截器的底层是通过动态代理实现的,所以本文就来盘点一下他们两的区别,以及拦截器的底层实现。1.拦截器拦截器(Interceptor)准确来说在SpringMVC中的一个很重要的组件,用于拦截Controller的请求。它的主要作用有以下几个:权限验证:验证用户是否登录、是否有权限访问某个接口。日志记录:记录请求信息的日志,如请求参数,响应信息等...
2023-11-17 11:17:51 1674浏览 0点赞 0回复 0收藏
分布式锁是一种用于保证分布式系统中多个进程或线程同步访问共享资源的技术。同时它又是面试中的常见问题,所以我们本文就重点来看分布式锁的具体实现(含实现代码)。在分布式系统中,由于各个节点之间的网络通信延迟、故障等原因,可能会导致数据不一致的问题。分布式锁通过协调多个节点的行为,保证在任何时刻只有一个节点可以访问共享资源,以避免数据的不一致性和冲突。1.分布式锁要求分布式锁通常需要满足以下几个要求:...
2023-11-17 11:17:19 1656浏览 0点赞 0回复 0收藏
MyBatis的缓存机制属于本地缓存,适用于单机系统,它的作用是减少数据库的查询次数,提高系统性能。MyBaits中包含两级本地缓存:一级缓存:SqlSession级别的,是MyBatis自带的缓存功能,默认开启,并且无法关闭,因此当有两个SqlSession访问相同的SQL时,一级缓存也不会生效,需要查询两次数据库。二级缓存:Mapper级别的,只要是同一个Mapper,无论使用多少个SqlSession来操作,数据都是共享的,多个不同的SqlSession可以共用...
2023-11-17 11:15:24 1846浏览 0点赞 0回复 0收藏
Autowired报错信息相信大部分程序员都遇到过,奇怪的是虽然代码报错,但丝毫不影响程序的正常执行,也就是虽然编译器IDEA报错,但程序却能正常的执行,那这其中的原因又是为何?报错原因分析报错的原因首先是因为IDEA强大的报警机制,Autowired为Spring的注解,含义是将某类动态的注入到当前类中,如下图所示:Autowired默认是根据type进行注入,并且注入时要求(注入)对象不能为NULL,默认值如下图所示:而IDEA报错的原因是:...
2023-11-17 11:15:04 2030浏览 0点赞 0回复 0收藏
延迟队列是指当消息被发送以后,并不是立即执行,而是等待特定的时间后,消费者才会执行该消息。延迟队列的使用场景有以下几种:未按时支付的订单,30分钟过期之后取消订单。给活跃度比较低的用户间隔N天之后推送消息,提高活跃度。新注册会员的用户,等待几分钟之后发送欢迎邮件等。1.如何实现延迟队列?延迟队列有以下两种实现方式:通过消息过期后进入死信交换器,再由交换器转发到延迟消费队列,实现延迟功能;使用官方提供...
2023-11-17 11:14:40 1422浏览 0点赞 0回复 0收藏
有位朋友,前两天突然问磊哥:在Java中,防止重复提交最简单的方案是什么?这句话中包含了两个关键信息,第一:防止重复提交;第二:最简单。于是磊哥问他,是单机环境还是分布式环境?得到的反馈是单机环境,那就简单了,于是磊哥就开始装了。话不多说,我们先来复现这个问题。模拟用户场景根据朋友的反馈,大致的场景是这样的,如下图所示:简化的模拟代码如下(基于SpringBoot):importorg.springframework.web.bind.annota...
2023-11-15 15:16:23 1712浏览 0点赞 0回复 0收藏
限流是一种控制访问速率的策略,用于限制系统、服务或API接口的请求频率或数量。它的目的是为了保护系统免受过多请求的影响,防止系统因过载而崩溃或变得不可用。限流是一种重要的性能优化和资源保护机制。限流的好处有以下几个:保护系统稳定性:如果系统接受太多请求,超出了其处理能力,可能导致系统崩溃或响应时间急剧增加,从而影响用户体验。限流可以帮助控制请求速率,确保系统稳定运行。保护系统可用性:有些资源可能是...
2023-11-15 15:15:14 1979浏览 0点赞 0回复 0收藏
限流的实现算法有很多,但常见的限流算法有三种:计数器算法、漏桶算法和令牌桶算法。1.计数器算法计数器算法是在一定的时间间隔里,记录请求次数,当请求次数超过该时间限制时,就把计数器清零,然后重新计算。当请求次数超过间隔内的最大次数时,拒绝访问。计数器算法的实现比较简单,但存在“突刺现象”。突刺现象是指,比如限流QPS(每秒查询率)为100,算法的实现思路就是从第一个请求进来开始计时,在接下来的1秒内,每来...
2023-11-15 15:14:29 2020浏览 0点赞 0回复 0收藏
首先来说Redis作为一个独立的三方系统,其天生的优势就是可以作为一个分布式系统来使用,因此使用Redis实现的锁都是分布式锁,理解了这个概念才能看懂本文所说的内容。分布式锁的示意图,如下所示:分布式锁实现使用Redis实现分布式锁,可以通过setnx(setifnotexists)命令实现,当我们使用setnx创建键值成功时,则表明加锁成功,否则既代码加锁失败。因为Redis主线程是单线程运行的,所以也不会有同时加锁成功的情况。实现命...
2023-11-15 15:12:37 1716浏览 0点赞 0回复 0收藏
HttpServletRequest简称Request,它是一个ServletAPI提供的对象,用于获取客户端发起的HTTP请求信息。例如:获取请求参数、获取请求头、获取Session会话信息、获取请求的IP地址等信息。那么问题来了,在SpringBoot中,获取Request对象的方法有哪些?常见的获取Request对象的方法有以下三种:通过请求参数中获取Request对象;通过RequestContextHolder获取Request对象;通过自动注入获取Request对象。具体实现如下。1.通过请求参...
2023-11-15 15:10:14 1845浏览 0点赞 0回复 0收藏
幻读是MySQL中一个非常普遍,且面试中经常被问到的问题,如果你还搞不懂什么是幻读?什么是MVCC?以及MySQL中的锁?那么请好好收藏和阅读本篇文章,因为它非常重要。RR隔离级别在MySQL中,RR代表RepeatableRead(可重复读),是数据库事务隔离级别中的一种,它的特性是保证同一个事务中,多次读取同一条记录时,读取到的数据都是一致的。它也是MySQL默认的事务隔离级别。隔离级别是数据库管理系统为了处理并发访问时,控制事务...
2023-11-15 15:09:48 1860浏览 0点赞 0回复 0收藏
无论是在项目开发中,还是在面试中过程中,总会被问到或使用到并发编程来完成项目中的某个功能。例如某个复杂的查询,无法使用一个查询语句来完成此功能,此时我们就需要执行多个查询语句,然后再将各自查询的结果,组装之后返回给前端了,那么这种场景下,我们就必须使用线程池来进行并发查询了。PS:磊哥做的最复杂的查询,总共关联了21张表,在和产品及需求方的多次沟通下,才将查询的业务从21张表,降到了至少要查询12张表...
2023-08-23 14:57:48 2138浏览 0点赞 0回复 0收藏
线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。在Java中,线程等待和通知的实现手段有以下几种方式:Object类下的wait()、notify()和notifyAll()方法;Condition类下的await()、signal()和signalAll()方法;LockSupport类下的park()和unpark()方法。为什么一个线程等待和通知机制就需要这么多的实现方式呢?别着急,咱们先来看实现,再来说原因。一、waitnotifyno...
2023-08-23 14:56:38 1846浏览 0点赞 0回复 0收藏
在分布式事务中,通常使用两阶段协议或三阶段协议来保障分布式事务的正常运行,它也是XOpen公司定义的一套分布式事务标准。XOpen公司是由多家国际计算机厂商所组成的联盟组织,它建立之初是为了向UNIX环境提供标准。分布式事务是指在分布式系统中,多个节点之间进行的事务操作。比如在分布式系统中,用户在下单时,需要同时创建订单信息和减库存的操作,然而创建订单信息和减库存是分布在不同服务器和不同数据库中的,如下图所...
2023-08-23 14:55:52 1748浏览 0点赞 0回复 0收藏
今天分享的这道题来自于蔚来的真实面试题。面试Java不可能不问Redis,问到Redis不可能不问Redis的常用数据类型,问到Redis的常用数据类型,不可能不问跳跃表,当问到跳跃表经常会被问到跳跃表的查询和添加流程,所以接下来我们一起来看这道题的答案吧。Redis有序集合ZSet是由ziplist(压缩列表)或skiplist(跳跃表)组成的。压缩列表ziplist本质上就是一个字节数组,是Redis为了节约内存而设计的一种线性数据结构,可以包含多个元...
2023-08-22 14:16:37 1856浏览 0点赞 0回复 0收藏
什么是Chat2DB?Chat2DB是一款由阿里巴巴开源免费的多数据库客户端工具,支持windows、mac本地安装,也支持服务器端部署,web网页访问。和传统的数据库客户端软件Navicat、DBeaver相比Chat2DB集成了AIGC的能力,能够将自然语言转换为SQL,也可以将SQL转换为自然语言,可以给出研发人员SQL的优化建议,极大的提升人员的效率,是AI时代数据库研发人员的利器,不懂SQL的运营或业务也可以轻松使用快速查询业务数据、生成报表的能力...
2023-08-22 14:15:50 2517浏览 0点赞 0回复 0收藏
面经来源于牛客,如下图所示:https:www.nowcoder.comfeedmaindetaile81eab8523914514a80ff66f3cacd984答案解析1.自我介绍在自我介绍时需要讲清楚以下4点:你是谁?你会什么技能?使用这些技能做出过什么项目或成绩?(如果有编程大赛的经历更好)你的优势是啥?为什么我们要用你?(可以讲解你的技术栈和企业技术栈的比较匹配)2.Map接口实现Map是接口,本身没有任何实现,但它的实现类有HashMap、LinkedHashMap和Tr...
2023-08-22 14:15:13 2187浏览 0点赞 0回复 0收藏
Java要掌握的技术点如下:JavaSE(JavaStandardEdition,Java基础)计算机基础和网络并发编程常见数据结构和算法MySQL数据库Spring全家桶(SpringSpringMVCSpringBoot)MyBatisMyBatisPlusJava虚拟机(JVM)Redis中间件消息队列SpringCloud体系(社招13年工作经验需要学习)接下来我们来看下这些模块中的重点内容是什么,以及如何学习这些知识点?1.JavaSEJavaSE是整个Java语言的开端和基础,JavaSE中的重点知识如下图所示:学...
2023-08-22 14:14:36 2691浏览 0点赞 0回复 0收藏