Java后端开发面试必问:ThreadLocal线程变量副本详解与面试技巧

在面试中,您将不可避免地遇到您的技术问题。这次,对于Java后端开发,以下文章列出了主要公司技术访问者可能会提及和回答的问题。如果您认为这很好,我希望与更多的求职者分享〜

Java后端开发面试必问:ThreadLocal线程变量副本详解与面试技巧

问题1

threadLocal(线程变量副本)

同步实现内存共享,而ThreadLocal为每个线程维护一个局部变量。

使用空间交换时间,该时间用于线程之间的数据隔离,为使用此变量的每个线程提供了一个副本。每个线程都可以独立更改自己的副本而不会与其他线程的副本冲突。

ThreadLocal类维护一个地图,该地图存储每个线程的变量副本。地图中元素的键是线程对象,该值是相应线程的变量的副本。

ThreadLocal在Spring中起着巨大的作用,它出现在请求范围的Bean,交易管理,任务调度,AOP和其他模块的管理中。

弹簧中的大多数豆类都可以称为单例示波器,并使用ThreadLocal封装。因此,状态豆可以在Singleton模式下通常在多线程中工作。

问题2

Java内存模型

程序计数器:是一种数据结构,用于保存当前正常执行的程序的内存地址。 Java虚拟机的多线程是通过依次切换线程并分配处理器时间来实现的。为了在线程切换后恢复到正确的位置,每个线程都需要一个独立的程序计数器,该计数器不会彼此影响,并且该区域是“私有”。

Java Virtual Machine堆栈:线程私有关系,与线程生命周期相同,用于存储本地变量表,操作堆栈和方法返回值。本地变量表包含基本数据类型和对象引用。

本地方法堆栈:它与虚拟机堆栈非常相似,但是它提供了虚拟机使用的本机方法。

Java堆:所有线程共享的内存区域,几乎所有对象实例都分配内存。

方法区域:每个线程共享的区域,存储类信息,常数,静态变量以及虚拟机加载的代码。

运行时常数池:在运行时表示每个类文件中的常数表。包括几个常数:编译时数字常数,方法或对域的引用。

问题3

Java GC什么时候

该怎么办

你做了什么?

新一代有一个伊甸园和两个幸存者地区。首先,将物体放入伊甸园。如果该空间不足,请将其放在幸存者之一。如果仍然无法放下它,它将触发新一代中发生的次要GC。幸存的物体放置在另一个幸存者区域,然后清除伊甸园和先前幸存者地区的记忆。在GC过程中,如果您发现仍然无法放下的对象,则将它们放入老年的记忆中。

大物体和长期幸存的物体直接进入老年人区域。

每次执行次要GC时,应分析要促进老年人的物体。如果即将到达老年人区域的这些老年物体的大小超过老年人区域的剩余大小,请执行完整的GC以获取尽可能多的。老年地区的空间。

新一代:复制和清理;

老年:标记清除和标记压缩算法;

永久生成:集体加载程序本身将类存储在Java中并加载类。

虚拟机堆栈中引用的对象

方法区域中静态属性引用的对象,常数引用的对象

局部方法堆栈中JNI(即常规本机方法)引用的对象。

问题4

同步和锁定都可以重交锁。当同一线程再次进入同步代码时,您可以使用已经获得的锁定。

同步是一种完全锁定的悲观锁机制。 Locks.Reentrantlock将在没有每次没有冲突的情况下完成操作而无需锁定,并在冲突成功之前重试。

线程在此期间等待控制锁的时间时需要中断

有些等待注意和重新输入需要单独处理,这可以控制要通知的线程,并且锁可以绑定多个条件。

通过公平的锁定,每个传入的线程都将排队。

问题5

StringBuffer是线程安全。每次操作字符串时,字符串都会生成一个新对象,但是StringBuffer不会; StringBuilder是非线程安全的。

问题6

该机制是Java集合中的错误机制。当多个线程在同一集合的内容上运行时,可能会生成故障狂潮事件。

例如:当某个线程通过迭代器横穿集合时,如果集合的内容通过其他线程更改;然后,当线程A访问该集合时,将抛出conturrentModification Exception异常,从而导致失败事件

问题7

发生在之前:如果两个操作之间发生了关系,则下一个操作将可见上一个操作的结果。

程序序列规则:线程中的每个操作,发生在该线程中的任何后续操作之前。

监视器锁定规则:解锁监视器锁,发生在此显示器锁的后续锁之前。

挥发性变量规则:编写一个挥发性字段,发生在此随后读取此波动性字段之前。

过渡性:如果a发生在b之前,则b发生在c之前,然后在C之前发生。

线程启动规则:线程对象的启动()方法发生 - 在此线程的每个动作之前。

问题8

不同的粒度,前者用于变量,后者用于对象和类

SYN块,挥发性线程不阻止

SYN确保三个主要特征,挥发性不能保证原子质

SYN编译器优化,挥发性不优化挥发性具有两个功能:

为了确保此变量对所有线程的可见性意味着线程修改该变量的值。新值可见其他线程,但不是多线程安全。

禁止重新订购并优化说明。

当编写挥发性变量时,JMM会在与主内存的线程相对应的本地内存中冲洗共享变量。

在读取挥发性变量时,JMM将使与线程相对应的本地内存无效。线程接下来将从主内存中读取共享变量。

问题9

CAS是一种乐观的锁定技术。当多个线程尝试使用CAS同时更新相同的变量时,只有一个线程才能更新变量的值,而其他线程失败。失败的线程不会被暂停,但会被告知。这场比赛失败了,可以再次尝试。 CAS有3个操作数,内存值V,旧期望值A和要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值v修改为b,否则什么也不做。

问题10

当程序启动时,创建了几个线程以进行响应和处理。它们称为线程池,内部的线程称为工作线程

减少资源消耗。通过重复使用创建的线程来减少线程创建和破坏引起的消耗。

提高响应速度。当任务到达时,可以立即执行任务,而无需等待线程创建。

提高线程可管理性。

执行人员服务是主要的实现类,其中常用的类别是执行者。newSingleThreadPool(),newfixedthreadpool(),newcachedtheheadpool()和newscheduledthreadpool()。

问题11

加载:将Java二进制代码导入JVM并生成类文件。

连接:

a)验证:检查加载类文件数据的正确性

b)准备:将存储空间分配给类的静态变量

c)分析:将符号引用转换为直接参考

初始化:对静态变量,静态方法和静态代码块进行初始化工作。

问题12

成年缓存:

数据结构:钥匙,价值对

如何使用:获取,放置等。

问题13

字符串 - 串(键值类型)

hash-dictionary(hashmap)redis哈希结构允许您仅修改一个属性值,就像在数据库中更新属性一样。

列表 - 实施消息队列

设置 - 集合利用独特性

排序集 - 分类集可以分类以实现数据持久性

问题14

B+,B-,全文索引

MySQL的索引是一种数据结构,旨在使数据库有效地找到数据。

常用的数据结构是B+树。每个叶子节点不仅存储索引密钥的相关信息,而且还为相邻的叶节点添加了指针,从而形成了一个带有顺序访问指针的B+树,该指针进行了优化。目的是在不同的间隔中提高访问的性能。

经常出现在一个又一个之后的字段中,顺序和不同的关键字

通常在联接字段上索引通常连接到其他表的表

经常出现在子句中的字段

用作查询选择的字段经常出现

问题15

弹簧支持三种依赖注入方法,即属性(设置器方法)注入,施工注入和界面注入。

在春季,那些组成应用程序的对象和春季IOC容器管理的对象称为bean。

弹簧的IOC容器通过反射机制实例化豆类,并在豆类之间建立依赖性。

简而言之,Bean是由Spring IOC容器初始化,组装和管理的对象。

获取Bean对象的过程是首先通过资源加载配置文件并启动IOC容器,然后通过GetBean方法获取Bean对象,然后调用其方法。

Singleton:Spring IOC容器中只有一个共享的BEAN实例,这通常是Singleton范围。

原型:每个请求将生成一个新的Bean实例。

请求:每个HTTP请求将生成一个新的BEAN实例。

问题16

商务舱只需要关注业务逻辑本身,以确保商业阶层的可重复性。

代理对象和目标对象实现相同的接口。目标对象是代理对象的属性。在特定接口实现中,代理对象可以在调用目标对象的相应方法之前和之后添加其他业务处理逻辑。

缺点:代理类只能代理一个商务舱。如果商务舱添加了一种方法,则相应的代理类还需要添加一种方法。

Java Dynamic代理是编写一个类来实现InvocationHandler接口,重写调用方法,并在执行Invoke方法时编写增强处理的逻辑。只有当该公共代理类正在运行时,才能阐明它想要代理的对象,同时它可以实现代理。实现类方法,然后在实现类方法时可以执行增强处理。

实际:代理对象的方法=增强的处理 +代理对象的方法

JDK Dynamic代理只能为实现接口的类生成代理(Instand a类)。在这个时代,代理对象和目标对象实现相同的接口。目标对象是代理对象的属性。在特定接口实现中,可以在调用目标对象的相应方法之前和之后添加其他业务处理逻辑。

CGLIB是一个类实现代理,主要是为指定类生成一个子类(不实例化类)并覆盖其中的方法。

绩效检测,访问控制,日志管理,交易等。

如果目标类实现接口,则默认策略是使用JDK动态代理技术。如果目标对象未实现接口,则将使用默认的CGLIB代理。

问题17

提交给dispatcherserv的客户请求

调度员控制器查询处理器,并将其分配给指定的控制器。

控制器调用业务逻辑处理后,它返回ModelAndView

DispatcherServlet查询一个或多个ViewResoler视图解析器,并找到ModelAndView指定的视图。

该视图负责向客户显示结果

问题18

DNS域名分辨率 - >启动TCP的三次握手 - >建立TCP连接并启动HTTP请求 - >服务器响应HTTP请求,并且浏览器获取HTML代码 - >浏览器解析HTML代码和请求HTML代码中的资源(例如JavaScript,CSS,图片等) - >浏览器将页面呈现给用户

设计一个称为“中层”的逻辑层。在此层上,从数据库中捕获大量数据并将其作为缓存,并将其运行在服务器的内存中。同样,当新数据到达时,首先使其成为缓存。 ,然后找到一种坚持到数据库的方法,这是一个简单的想法。主要步骤是负载平衡,将请求从不同用户分配到不同的处理节点,然后首先将其保存在缓存中,然后定期将数据更新到主数据库。阅读和写作过程采用类似于乐观锁定的机制,可以一直读取该机制(在编写数据时也可以阅读),但是每次阅读时都会有一个版本标记。如果此时间读取的版本低于缓存版本,则它将重新读取数据不多,因此可以容忍。

问题19

cookie允许服务器跟踪每个客户端的访问,但是这些cookie必须将其传输回每个客户端的访问。如果有很多cookie,它将明显增加客户端和服务器之间的数据传输量。

会议很好地解决了这个问题。每当相同的客户端与服务器进行交互时,它都会通过会话将数据存储到服务器。它不需要每次都会传递所有cookie值,而是要将其传递给ID,每个客户端首次访问服务器生成的唯一ID。客户只需要将此ID传递回。该ID通常是带有名称jsessionId的曲奇。这样,服务器可以使用此ID检索存储在服务器上的KV值。

会话和饼干的超时问题,cookie的安全问题

问题20

配置服务器,Zookeeper群集管理服务器可以以统一的方式管理所有服务器配置文件

共享这些会话存储在分布式缓存中,可以随时编写和阅读,并且具有良好的性能,例如Memcache,Tair。

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

26阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

26阅读