写点什么

阿里 Java 面试手册 -Java 面试题总结 (附答案)——互联网大厂都在问的 Java 面试题,而你从没看过!

  • 2024-10-16
    湖南
  • 本文字数:9194 字

    阅读完需:约 30 分钟

阿里 Java 面试手册-Java 面试题总结(附答案)——互联网大厂都在问的 Java 面试题,而你从没看过!

目录


性能优化面试专题-Tomcat 性能优化

1、你怎样给 tomcat 调优 JVM 参数调优: -Xms<size>表示 JVM 初始化堆的大小,-Xms<size>表示 JVM 堆的最大值。这两个值的大小一般根据需要进行设置。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的 80%。在 catalina.bat 中,设置 JAVA_ 0PTS= '-Xms256m-Xmx512m',表示初始化内存为 256MB,可以使用的最大内存为 512MB。


2.禁用 DNS 查询


当 web 应用程序向要记录客户端的信息时,它也会记录客户端的 IP 地址或 者通过域名服务器查找机器名转换为 IP 地址。DNS 查询需要占用网络,并 且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的 IP 的过程,这样会消耗一定的时间。为了消除 DNS 查询对性能的影响我们可 以关闭 DNS 查询,方式是修改 server. xml 文件中的 enableLookups 参数值:


Tomcat4className="org.apache.coyote.tomcat4.CoyoteConnector"port="80"minProcessors="5"maxProcessors="75"enableLookups="false"redirectPort="8443"acceptCount="100"debug="0"connectionTimeout="20000"useURIValidationHack="false"disableUploadTimeout="true"/>Tomcat5maxSpareThreads="75"enableLookups="false"redirectPort="8443"acceptCount="100"debug="0"connectionTimeout="20000"disableUploadTimeout="true"/>3.调整线程数


通过应用程序的连接器 ҁCon nector ҂ 进行性能控制的的参数是创建的处理请求的线程数。 Tomcat 使用线程池加速响应速度来处理请求。在 Java 中线程是程序运行时的路径,是在—个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序 员写出 CPU 最大利用率的高效程序,使空闲时间保持最低,从而接更多的 请求。


Tomcat4 中可以通过修改 minProcessors 和 maxProcessors 的值来控 制线程数。这些值在安装后就已经设定为默认值并且是足够使用的,但是 随着站点的扩容而改大这些。 minProcessors 服务器启动时创建的处 理请求的线程数应该足够处理—个小量的负载。也就是说,如果—天内每 秒仅发生 5 次单击事件,并且每个请求任务处理需要 1 秒钟,那么预先设置 线程数为 5 就足够了。但在你的站点访问量较大时就需要设置更大的线程 数,指定为参数 maxProcessors 的值。 maxProcessors 的值也是有上 限的,应防止流量不可控制(或者恶意的服务攻击),从而导致超出了虚 拟机使用内存的大小。如果要加大并发连接数,应同时加大这两个参数。 web server 允许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个左右, Linux 是 1000 个左右。


在 Tomcat5 对这些参数进行了调整,请看下面属性:


maxThreads Tomcat 使用线程来处理接收的每个请求。这个值表示 Tomcat 可创建的最大的线程数。


acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可 以放到处理队列中的请求数,超过这个数的请求将不予处理。


connnection Timeout 网络连接超时,单位:毫秒。


设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒。


minSpareThreadsTomcat 初始化时创建的线程数。


maxSpareThreads —旦创建的线程超过这个值, Tomcat 就会关闭不再 需要的 socket 线程。


最好的方式是多设置几次并且进行测试,观察响应时间和内存使用情况。 在不同的机器、操作系统或虚拟机组合的情况下可能会不同,而且并不是 所有人的 web 站点的流量都是—样的,因此没有—刀切的方案来确定线程 数的值。


2、如何加大 comcat 连接数在 tomcat 配置文件 server.xml 中的 <Connector/> 配置中,和连接数相关的参数有:


minProcessors :最小空闲连接线程数,用于提高系统处理性能,默认 值为 10 maxProcessors :最大连接线程数,即:并发处理的最大请求数,默认 值为 75​


acceptCount :允许的最大连接数,应大于等于 maxProcessors ,默 认值为 100


enableLookups :是否反查域名,取值为: true 或 false。为了提高处理能 力,应设置为 false


connectionTimeout :网络连接超时,单位:毫秒。设置为 0 表示永不 超时,这样设置有隐患的。通常可设置为 30000 毫秒。


其中和最大连接数相关的参数为 maxProcessors 和 acceptCount。如果要加 大并发连接数,应同时加大这两个参数。


web server 允许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个左右, Linux 是 1000 个左右。 tomcat5 中的配置示例:


maxThreads="150"minSpareThreads="25"maxSpareThreads="75"


enableLookups="false"redirectPort="8443"acceptCount="100"debug="0"connectionTimeout="20000"disableUploadTimeout="true"/>对于其他端口的侦听配置,以此类推。


3、怎样加大 tomcat 的内存首先检查程序有没有限入死循环


这个问题主要还是由这个问题 java. lang.OutOfMemoryError:Java


heap space 引起的。第—次出现这样的的问题以后,引发了其他的问题。在网上—查 可能是 JAVA 的堆栈设置太小的原因。


跟据网上的答案大致有这两种解决方法:


1、设置环境变量


解决方法:手动设置 Heap size


修改 TOMCAT_HOME/bin/catalina.sh


setJAVA_OPTS=-ms32m-Xmx512m


可以根据自己机器的内存进行更改。


2 、 java-Xms32m-Xmx800m className


就是在执行 JAVA 类文件时加上这个参数,其中 className 是需要执行的确类名。(包括包名)这个解决问题了。而且执行的速度比没有设置的时候快很多。如果在测试的时候可能会用 Eclispe 这时候就需要在 Eclipse->run-arguments 中的 VM arguments 中输入-Xms32m-Xmx800m 这个参数就可以了。



后来在 Eclilpse 中修改了启动参数,在 VMarguments 加入了-Xms32m-Xmx800m,问题解决。


一、java.lang.OutOfMemoryError:PermGen space


PermGen space 的全称是 Permanent Generation space,是指内存的永久保存区域,


这块内存主要是被 JVM 存放 Class 和 Meta 信息的,Class 在被 Loader 时就会被放到 PermGen space 中,它和存放类实例(Instance)的 Heap 区域不同,GC(Garbage Collection)不会在主程序运行期对 PermGen space 进行清理,所以如果你的应用中有很多 CLASS 的话,


就很可能出现 PermGen space 错误,这种错误常见在 web 服务器对 JSP 进行 preco mpile 的时候。如果你的 WEB APP 下都用了大量的第三方 jar,其大小超过了 jvm 默认的大小(4M)那么就会产生此错误信息了。


解决方法:手动设置 MaxPermSize 大小修改 TOMCAT_HOME/bin/catalina.sh


在“echo"Using CATALINA_BASE:$CATALINA_BASE"”上面加入以下行:JAVA_0PTS="-server-XX:PermSize=64M-XX:MaxPermSize=128m


建议:将相同的第三方 jar 文件移置到 tomcat/shared/lib 目录下,这样可以达到减少 jar 文档重复占用内存的目的。


二、java.lang.Out0fMemoryError:Java heap space


Heap size 设置


JVM 堆的设置是指 java 程序运行过程中 JVM 可以调配使用的内存空间的设置.JVM 在启动的时候会自动设置 Heap size 的值,其初始空间(即-Xms)是物理内存的 1/64,最大空间(-Xmx)是物理内存的 1/4。可以利用 JVM 提供的-Xmn-Xms-Xmx 等选项可进行设置。Heapsize 的大小是 Young Generation 和 TenuredGeneraion 之和。


提示:在 JVM 中如果 98%的时间是用于 GC 且可用的 Heap size 不足 2%的时候将抛出此异常信息。


提示:Heap Size 最大不要超过可用物理内存的 80%,一般的要将 Xms 和-Xmx 选项设置为相同,而-Xmn 为 1/4 的-Xmx 值。


解决方法:手动设置 Heap size


修改 TOMCAT_HOME/bin/catalina.sh


在“echo"Using CATALINA_BASE:$CATALINA_BASE"”上面加入以下行:JAVA_0PTS="-server-Xms800m-Xmx800m-XX:MaxNewSize=256m"


三、实例,以下给出 1G 内存环境下 java jvm 的参数设置参考:


JAVA_0PTS="-server-Xms800m-Xmx800m-XX:PermSize=64M-XX:MaxNewSize=256m-XX:MaxPermSize=128m-Djava.awt.headless=true"


很大的 web 工程,用 tomcat 默认分配的内存空间无法启动,如果不是在 myeclipse 中启动 tomcat 可以对 tomcat 这样设置:


TOMCAT_HOME/bin/catalina.bat 中添加这样一句话:


set JAVA_0PTS=-server-Xms2048m-Xmx4096m-XX:PermSize=512M-XX:MaxPermSize=1024M-Duser.timezone=GMT+08 或者


set JAVA_OPTS=-Xmx1024M-Xms512M-XX:MaxPermSize=256m 如果要在 myeclipse 中启动,上述的修改就不起作用了,可如下设置:Myeclipse->preferences->myeclipse->servers->tomcat->tomcatx.x->JDK 面板中的 Optional Java VM arguments 中添加:Xmx1024M-Xms512M-XX:MaxPermSize=256m


以上是转贴,但本人遇见的问题是:在 myeclipse 中启动 Tomcat 时,提示"ava.lang.OutOfMemoryError:Java heap space",解决办法就是:Myeclipse->preferences->myeclipse>servers->tomcat->tomcatx.x->JDK 面板中的


Optional Java VM arguments 中添加:-Xmx1024M-Xms512M-


XX:MaxPermSize=256m


二、JVM 性能优化专题 1、Java 类加载过程 Java 类加载需要经历一下 7 个过程:


1.加载


加载是类加载的第一个过程,在这个阶段,将完成一下三件事情:


●通过一个类的全限定名获取该类的二进制流。


●将该二进制流中的静态存储结构转化为方法去运行时数据结构。


●在内存中生成该类的 Class 对象,作为该类的数据访问入口。


2.验证


验证的目的是为了确保 Class 文件的字节流中的信息不回危害到虚拟机.在该阶段主要完成以下四钟验证:


●文件格式验证:验证字节流是否符合 Class 文件的规范,如主次版本号是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型.


●元数据验证:对字节码描述的信息进行语义分析,如这个类是否有父类,是否集成了不被继承的类等。


●字节码验证:是整个验证过程中最复杂的一个阶段,通过验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳转指令是否正确等。


●符号引用验证:这个动作在后面的解析过程中发生,主要是为了确保解析动作能正确执行。


3.准备


准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在 Java 堆中。


public static int value=123;//在准备阶段 value 初始值为 0 。在初始化阶段才会变为 123 。


4.解析


该阶段主要完成符号引用到直接引用的转换动作。解析动作并不一定在初始化动作完成之前,也有可能在初始化之后。


5.初始化


初始化时类加载的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中的定义的 java 程序代码。


6.使用


7.卸载


2、java 内存分配●寄存器:我们无法控制。


●静态域:static 定义的静态成员。


●常量池:编译时被确定并保存在.class 文件中的(final)常量值和


一些文本修饰的符号引用(类和接口的全限定名,字段的名称和描述符,方法和名称和描述符)。


●非 RAM 存储:硬盘等永久存储空间。


●堆内存:new 创建的对象和数组,由 Java 虚拟机自动垃圾回收器管理,存取速度慢。


●栈内存:基本类型的变量和对象的引用变量(堆内存空间的访问地址),速度快,可以共享,但是大小与生存期必须确定,缺乏灵活性。


1.Java 堆的结构是什么样子的?什么是堆中的永久代(Perm Genspace)?


JVM 的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在 JVM 启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。


堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。


3、描述一下 JVM 加载 Class 文件的原理机制?Java 语言是一种具有动态性的解释型语言,类(Class)只有被加载到 JVM 后才能运行。当运行指定程序时,JVM 会将编译生成的.class 文件按照需求和一定的规则加载到内存中,并组织成为一个完整的 Java 应用程序。这个加载过程是由类加载器完成,具体来说,就是由 ClassLoader 和它的子类来实现的。类加载器本身也是一个类,其实质是把类文件从硬盘读取到内存中。


类的加载方式分为隐式加载和显示加载。隐式加载指的是程序在使用 new 等方式创建对象时,会隐式地调用类的加载器把对应的类加载到 JVM 中。显示加载指的是通过直接调用 class.forName()方法来把所需的类加载到 JVM 中。


任何一个工程项目都是由许多类组成的,当程序启动时,只把需要的类加载到 JVM 中,其他类只有被使用到的时候才会被加载,采用这种方法一方面可以加快加载速度,另一方面可以节约程序运行时对内存的开销。


此外,在 Java 语言中,每个类或接口都对应一个.class 文件,这些文件可以被看成是一个个可以被动态加载的单元,因此当只有部分类被修改时,只需要重新编译变化的类即可,而不需要重新编译所有文件,因此加快了编译速度。


在 Java 语言中,类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(例如基类)完全加载到 JVM 中,至于其他类,则在需要的时候才加载。


类加载的主要步骤:


●装载。根据查找路径找到相应的 class 文件,然后导入。


●链接。链接又可分为 3 个小步:


●检查,检查待加载的 class 文件的正确性。


●准备,给类中的静态变量分配存储空间。


●解析,将符号引用转换为直接引用(这一步可选)


●初始化。对静态变量和静态代码块执行初始化工作。


三、Mysql 性能优化整理 mysql 优化面试题 MySQL 是一种常用的关系型数据库管理系统,广泛应用于各种 Web 应用程序和后台系统中。为了充分发挥 MySQL 的性能优势,需要进行相应的优化工作。本文将提供一些常见的 MySQL 优化面试题,并针对每个问题给出详细的解答。


1.什么是索引?如何创建索引?索引是一种数据结构,用于加快数据库的查询速度。在 MySQL 中,可以使用 CREATE INDEX 语句来创建索引。例如,CREATE INDEX idx_name ON table_name (column_name);可以创建名为 idx_name 的索引,它将基于 table_name 表中的 column_name 列。


2.如何优化查询性能?可以采取以下措施来优化查询性能:


使用索引:对经常用于查询的列创建适当的索引,可以大大提高查询性能。减少查询返回的列数:只返回需要的列,减少查询的数据量。增加缓存:适当配置缓存可以减少对数据库的频繁访问。避免使用 SELECT *:避免使用 SELECT *查询所有列,而是明确指定需要的列。避免在 WHERE 子句中使用函数:使用函数会导致索引无法使用,可以考虑在应用层面处理。3.如何避免慢查询?慢查询是指执行时间较长的查询操作。为避免慢查询,可以采取以下方法:


使用合适的索引:根据具体查询需求创建适当的索引,以提高查询速度。优化查询语句:通过分析查询语句,找出潜在的性能问题并进行优化。避免全表扫描:尽可能地利用索引来进行查询,避免对整个表进行扫描。配置合理的缓存:通过合理配置数据库的缓存参数来提高查询性能。.........


SpringCloud 面试整理 1、什么是 Spring Cloud?Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。


2、使用 Spring Cloud 有什么优势?使用 Spring Boot 开发分布式微服务时,我们面临以下问题


●与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题。


●服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。


●冗余-分布式系统中的冗余问题。


●负载平衡--负载平衡改善跨多个计算资源的工作负荷,诸如计算机,计算机集群,网络链路,中央处理单元,或磁盘驱动器的分布。


●性能-问题由于各种运营开销导致的性能问题。


●部署复杂性-Devops 技能的要求。


3、服务注册和发现是什么意思?Spring Cloud 如何实现?当我们开始一个项目时,我们通常在属性文件中进行所有的配置。随着越来越多的服务开发和部署,添加和修改这些属性变得更加复杂。有些服务可能会下降,而某些位置可能会发生变化。手动更改属性可能会产生问题。Eureka 服务注册和发现可以在这种情况下提供帮助。由于所有服务都在 Eureka 服务器上注册并通过调用 Eureka 服务器完成查找,因此无需处理服务地点的任何更改和处理。


SpringBoot 面试整理 1、什么是 SpringBoot?多年来,随着新功能的增加,spring 变得越来越复杂。只需访问.​​https://spring.io/projects​​页面,我们就会看到可以在我们的应用程序中使 用的所有 Spring 项目的不同功能。如果必须启动一个新的 Spring 项目, 我们必须添加构建路径或添加 Maven 依赖关系,配置应用程序服务器, 添加 spring 配置。因此,开始一个新的 spring 项目需要很多努力,因为 我们现在必须从头开始做所有事情。 Spring Boot 是解决这个问题的方法。Spring Boot 已经建立在现有 spring 框架之.上。使用 spring 启动,我们避免了之前我们必须做的所有样板代码 和配置。因此,Spring Boot 可以帮助我们以最少的工作量,更加健壮地使 用现有的 Spring 功能。


2、Spring Boot 有哪些优点?Spring Boot 的优点有:


减少开发,测试时间和努力。


使用 JavaConfig 有助于避免使用 XML。避免大量的 Maven 导入和各种版本冲突。提供意见发展方法。


通过提供默认值快速开始开发。


没有单独的 Web 服务器需要。这意味着你不再需要启动 Tomcat,Glassfish 或其他任何东西。


需要更少的配置因为没有 web.xml 文件。只需添加用 @Configuration 注释的类,然后添加用 @Bean 注释的方法,Spring 将自动加载对象并像以前一样对其进行管理。您甚至可以将 @Autowired 添加到 bean 方法中,以使 Spring 自动装入需要的依赖关系中。基于环境的配置使用这些属性,您可以将您正在使用的环境传递到应用程序:-Dspring.profiles.active ={enviornment}。在加载主应用程序属性文件后,Spring 将在


(application{environment}.properties)中加载后续的应用程序属性文件。


3、什么是 JavaConfig?Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring loC 容器的纯 Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig 的优点在于:


面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个配置类可以继承另一个,重写它的 @Bean 方法等。


减少或消除 XML 配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在 XML 和 Java 之间来回切换。JavaConfig 为开发人员提供了一种纯 Java 方法来配置与 XML 配置概念相似的 Spring 容器。从技术角度来讲,只使用 JavaConfig 配置类来配置容器是可行的,但实际上很多人认为将 JavaConfig 与 XML 混合匹配是理想的。类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring 容器。由于 Java 5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。


Dubbo 面试整理 1、Dubbo 中 zookeeper 做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?可以通信的,启动 dubbo 时,消费者会从 zk 拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用;注册中心对等集群,任意一台宕机后,将会切换到另一台;注册中心全部宕机后,服务的提供者和消费者仍能通过本地缓存通讯。服务提供者无状态,任一台宕机后,不影响使用;服务提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务者恢复;挂掉是不要紧的,但前提是你没有增加新的服务,如果你要调用新的服务,则是不能办到的。


(2)健状性:


·监控中心宕掉不影响使用,只是丢失部分采样数据


·数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务


注册中心对等集群,任意一台宕掉后,将自动切换到另一台


注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯


·服务提供者无状态,任意一台岩掉后,不影响使用


·服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复


2、dubbo 服务负载均衡策略?l Random LoadBalance


随机,按权重设置随机概率。在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。(权重可以在 dubbo 管控台配置)


I RoundRobin LoadBalance


轮循,按公约后的权重设置轮循比率。存在慢的提供者累积请求问题,比


如:第二台机器很慢,但没挂,当请求调


到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。


l LeastActive LoadBalance


最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。使慢的提供者收到更少请求,因为越慢的提供者的


调用前后计数差会越大。


I ConsistentHash LoadBalance


一致性 Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。缺省只对第一个参数 Hash,如果要修改,请配置


<dubbo:parameter key="hash.arguments"value="0,1"/>


缺省用 160 份虚拟节点,如果要修改,请配置


<dubbo:parameter key="hash.nodes"value="320"/>


并发编程高级面试专栏 1、Synchronized 用过吗,其原理是什么?这是一道 Java 面试中几乎百分百会问到的问题,因为没有任何写过并发程序的开发者会没听说或者没接触过 Synchronized。Synchronized 是由 JVM 实现的一种实现互斥同步的一种方式,如果你查看被 Synchronized 修饰过的程序块编译后的字节码,会发现,被 Synchronized 修饰过的程序块,在编译前后被编译器生成了 monitorenter 和 monitorexit 两个字节码指令。这两个指令是什么意思呢?在虚拟机执行到 monitorenter 指令时,首先要尝试获取对象的锁:如果这个对象没有锁定,或者当前线程已经拥有了这个对象的锁,把锁的计数器+1;当执行 monitorexit 指令时将锁计数器-1;当计数器为 0 时,锁就被释放了。如果获取对象失败了,那当前线程就要阻塞等待,直到对象锁被另外一个线程释放为止。Java 中 Synchronize 通过在对象头设置标记,达到了获取锁和释放锁的目的。


2、你刚才提到获取对象的锁,这个“锁”到底是什么?如何确定对象的锁?“锁”的本质其实是 monitorenter 和 monitorexit 字节码指令的一个 Reference 类型的参数,即要锁定和解锁的对象。我们知道,使用 Synchronized 可以修饰不同的对象,因此,对应的对象锁可以这么确定。


1.如果 Synchronized 明确指定了锁对象,比如 Synchronized(变量名)、Synchronized(this)等,说明加解锁对象为该对象。


2.如果没有明确指定:


若 Synchronized 修饰的方法为非静态方法,表示此方法对应的对象为锁对象;


若 Synchronized 修饰的方法为静态方法,则表示此方法对应的类对象为锁对象。


注意,当一个对象被锁住时,对象里面所有用 Synchronized 修饰的方法都将产生堵塞,而对象里非 Synchronized 修饰的方法可正常被调用,不受锁影响。


开源框架面试题专栏


分布式面试专栏


注:篇幅有限,资料已整理成文档,查看下方名片获取! 


用户头像

公众号:程序员高级码农 2022-07-03 加入

公众号:程序员高级码农

评论

发布
暂无评论
阿里Java面试手册-Java面试题总结(附答案)——互联网大厂都在问的Java面试题,而你从没看过!_Java 面试_程序员高级码农_InfoQ写作社区