2022-04-03 面试题:synchronized 部分原理+常量池部分问题+自动装箱/http 部分问题

2023-11-05

2022-04-03 synchronized 部分原理+常量池部分问题+自动装箱/http 部分问题

部分整理参考来自
https://blog.csdn.net/zzti_erlie/article/details/86587263?utm_source=app&app_version=5.3.0
https://blog.csdn.net/zzti_erlie/article/details/103997713?utm_source=app&app_version=5.3.0

新十道

  1. synchronized关键字可以实现什么类型的锁?
    jdk1.6 版本以后,锁的升级使得 synchronized 得到了一个质的优化。实现锁的种类也更加丰富
    原本 synchronized 实现的锁:
  • 悲观锁:synchronized关键字实现的是悲观锁,每次访问共享资源时都会上锁。
  • 非公平锁:synchronized关键字实现的是非公平锁,即线程获取锁的顺序并不一定是按照线程阻塞的顺序。
  • 独占锁或者排他锁:synchronized关键字实现的是独占锁,即该锁只能被一个线程所持有,其他线程均被阻塞。
    1.6 之后增加:
  • 可重入锁:synchronized关键字实现的是可重入锁,即已经获取锁的线程可以再次获取锁。
  • 轻量级锁:当短时间,线程竞争较少的情况下,会优先启动轻量级锁,效率更高
  • 偏向锁:某一线程拥有synchronized 锁对象后,synchronized 会偏向于该线程,使得下次该线程获得锁更容易。
  1. 偏向锁原理和升级过程
    偏向锁过程:当线程1访问代码块并获取锁对象时,使用 cas 加锁成功时,会在java对象头和栈帧中记录偏向的锁的threadID,因为偏向锁不会主动释放锁,线程一再次主动获取该锁时,则无需使用CAS来加锁、
    解锁:
  • 改变偏向:如果不一致(其他线程,如线程2要竞争锁对象,而偏向锁不会主动释放因此还是存储的线程1的threadID),那么需要查看Java对象头中记录的线程1是否存活,如果没有存活,那么锁对象被重置为无锁状态,其它线程可以改变偏向。如果线程1 不再使用该锁对象,且线程 2 多次索取该锁 那么将锁对象状态设为无锁状态,重新偏向新的线程。
  • 锁升级:如果存活,那么立刻查找该线程(线程1)的栈帧信息,如果还是需要继续持有这个锁对象,那么暂停当前线程1,撤销偏向锁,升级为轻量级锁,
  1. 为什么要引入轻量级锁?

轻量级锁考虑的是竞争锁对象的线程不多,而且线程持有锁的时间也不长的情景。因为阻塞线程需要CPU从用户态转到内核态,代价较大,所以在几个线程轮流来获取锁的情况下,使用轻量级锁就足够了。

  1. 轻量级锁原理和升级过程

线程1获取轻量级锁时会先把锁对象的对象头MarkWord复制一份到线程1的栈帧中创建的用于存储锁记录的空间(称为DisplacedMarkWord),然后使用CAS把对象头中的内容替换为线程1存储的锁记录(DisplacedMarkWord)的地址;此时完成的偏向锁的上锁。

此时如果线程 2 来竞争锁,进行 cas 获取锁对象上的锁记录地址,但是发现已经被线程一占用了,此时他就会进行锁自旋。(不断 cas)

  • 如果在自旋过程中,线程一放弃了对锁的占用,线程二获取锁,锁变为轻量级锁
  • 而自旋是有次数限制的,自旋到了还没有释放锁,就会发生锁膨胀,编程重量级锁,将所有没拥有锁的线程都放到阻塞队列里。
  1. 为什么要有常量池?
    常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。
    例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。
    (1)节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。
    (2)节省运行时间:比较字符串时,== 比equals()快。对于两个引用变量,只用==判断引用是否相等,也就可以判断实际值是否相等。
  2. 关于常量池的一些问题
  • Java有8种基本数据类型
    整数类型:byte,short,int,long。包装类型为Byte,Short,Integer,Long
    浮点类型:float、double。包装类型为Float,Double
    字符类型:char。包装类型为Character
    布尔类型:boolean。包装类型为Boolean
    8种包装类型中除了Float,Double没有实现常量池,剩下的都实现了
  • 什么是自动装箱,自动拆箱
    自动装箱指的就是将原始的 java 类值变为一个对象。自动拆箱与其相反。
  • Integer 类常量池引发的问题
    主要的问题是,Integer 在[-128,127]里对象是直接取自常量池的。
public static Integer valueOf(int i) {
    // i的取值范围为[-128,127]
	if (i >= IntegerCache.low && i <= IntegerCache.high)
		return IntegerCache.cache[i + (-IntegerCache.low)];
	return new Integer(i);
}

而超过这个范围,就要创建一个新的对象。
所以:

Integer a1 = 40;
Integer a2 = 40;
// true
System.out.println(a1 == a2);相等
Integer a3 = 200;
Integer a4 = 200;
// false
System.out.println(a3 == a4);//不相等
  • String 常量池
    有这样个问题:
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
String str4 = new String("abc");
// true
System.out.println(str1 == str2);
// false
System.out.println(str1 == str3);
// false
System.out.println(str3 == str4);

解释是这样的:

采用字面值的方式创建一个字符串时,JVM首先会去字符串池中查找是否存在"abc"这个对象

如果不存在,则在字符串池中创建"abc"这个对象,然后将池中"abc"这个对象的地址赋给str1,这样str1会指向池中"abc"这个字符串对象

如果存在,则不创建任何对象,直接将池中"abc"这个对象的地址返回,赋给str2。因为str1、str2指向同一个字符串池中的"abc"对象,所以结果为true。
而如果是 new 的:
无论常量池有没有都在堆里创建,常量池没有的话给常量池也创建一个对应的。
采用new关键字新建一个字符串对象时,JVM首先在字符串池中查找有没有"abc"这个字符串对象,

如果没有,则首先在字符串池中创建一个"abc"字符串对象,然后再在堆中创建一个"abc"字符串对象,然后将堆中这个"abc"字符串对象的地址赋给str3

如果有,则不在池中再去创建"abc"这个对象了,直接在堆中创建一个"abc"字符串对象,然后将堆中的这个"abc"对象的地址赋给str4。这样,str4就指向了堆中创建的这个"abc"字符串对象;

复习五道

  1. 什么是HTTP报文?
    Http报文就是客户端和服务端之间传送的数据块

  2. HTTP报文由哪三部分组成?
    HTTP报文由起始行,头部,主体组成,其中起始行是对该报文进行的描述,头部是对报文的属性进行的描述,主体则是数据的内容。

  3. HTTP报文分为哪两类?
    HTTP报文分为请求报文和响应报文,当客户端给服务器发送请求时,发送的报文就是请求报文,当服务器端給客户端返回请求时,返回的请求就是响应报文。

  4. HTTP常见的请求方法有哪些?
    常见的请求方式有
    get请求:向服务器端发送报文,
    post请求:向服务器端发送待处理的数据请求,
    HEAD请求:获取服务器端制定的报文头部信息,
    PUT请求:向服务器端发送请求并且更改制定的信息,
    DELETE请求:删除指定的报文数据

  5. HTTP的状态码分为哪几类?
    100-101(2个)代表有提示信息,
    200-206:代表请求成功 ,
    300-305:重定向或者转发
    400-415:客户端方出现了错误
    500-505 :服务端出现了错误

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2022-04-03 面试题:synchronized 部分原理+常量池部分问题+自动装箱/http 部分问题 的相关文章

  • Android 和 Java Uuid

    我想为我的应用程序生成一个uuid 我尝试了很多东西 例如wifi mac地址 获取android id 序列号 从设备创建伪uuidandroid os Build特性 我还知道java本身有Uuid创建者类java util UUID
  • 如何创建约束输入流以仅读取文件的一部分?

    我想创建一个仅限于文件中一定范围的字节的输入流 例如从位置 0 到 100 的字节 这样 一旦到达第 100 个字节 客户端代码就应该看到 EOF The read 的方法InputStream一次读取一个字节 你可以写一个子类InputS
  • 有没有什么工具可以验证@XmlPath注释? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何工具可以在 Eclipse 或 IntelliJIdea java 框架或其他框架编译时验证
  • PHP 和 ESB(使用 Mule)(ESB:企业服务总线)

    您在 PHP 项目中何时 何地以及为何使用 ESB 您认为在何处 何时以及为何在 PHP 项目中使用 ESB 有意义 ESB 以及像 Mule 这样的 ESB 促进者 是否提供了 PHP 和本地 LAMP 技术所缺乏的任何功能 Edit 我
  • 如何使用 DirectoryStream.Filter 过滤隐藏文件

    我正在尝试使用 NIO 类过滤隐藏文件 当我在 Windows 10 上运行随附的代码时 我得到以下输出 Files c Documents and Settings c PerfLogs c Program Files c Program
  • 如何解决Spring Data JPA中的N+1问题?

    我使用 Spring Data JPA 作为持久层 并且面临 N 1 问题 我还使用规范 API 因为我发现很难解决 N 1 问题 请帮忙 Entity public class PopulationHealth Id private in
  • 在 IntelliJ IDEA 中编辑并继续?

    使用 IntelliJ IDEA 社区版进行调试时是否可以编辑一些代码 我在选项中找不到这个功能 是的 这就是所谓的 热插拔 您可以在调试过程中编译修改后的代码 并且类文件将被替换 直到您停止调试 确保在调试器设置中启用 HotSwap 选
  • Groovy 2.0.1,我自己的类上有 GroovyCastException?

    我在我的网络应用程序项目中广泛使用 Groovy 类 我可以创建类型的实例 定义为 groovy 类 但以后永远不能转换回它 GroovyCastException发生 org codehaus groovy runtime typehan
  • W/Firestore:[CustomClassMapper]:Android 类没有设置器/字段

    我试图使用 Recyclerview 从 Documents 类加载数据 但 logcat 上出现错误 W Firestore 21 1 1 CustomClassMapper No setter field for Document Na
  • 查看tomcat服务器的连接数

    我在 Tomcat Server 5 5 17 上部署了一个 Java Java EE Web 应用程序 我想知道连接到服务器的客户端数量 我们怎样才能找到它呢 最可靠的方法是搜索ip addr of srv port in netstat
  • 如何将一个组件放在其他组件之上?

    我有一个JScrollPanel其中包括一个大面板 其本身包括 3 个内面板 我想将一个面板 例如 放在一个特殊的位置 以便始终可以看到 我的意思是用户可以滚动到想要的任何地方 但该面板始终位于其他组件的顶部并且不会移动 我试图通过这样做J
  • Spring Hibernate 4 支持

    我正在使用 Hibernate 4 CR1 我的应用程序之前使用 Spring hibernate 支持 版本 3 我还没有找到任何相关信息 是否有任何迹象表明 Spring 何时 或哪个版本 将提供对 Hibernate 4 的支持 UP
  • 将私有 Java 9 模块包公开给 JUnit 的正确方法是什么?

    我有一个 可执行 Java 9 模块 意味着它不会公开任何包 它只包含一个main函数 我需要测试 我正在使用 Gradle 的java library and org gradle java experimental jigsaw插件 我
  • Android Widget 实现

    嗨 如果这个问题很愚蠢 我提前道歉 我对 Android 编程相当陌生 而且学得很快 我刚刚创建了一个任务提醒应用程序 并且想将该应用程序转换 实现为一个可以在主屏幕上查看的小部件 有什么方法吗 这可能吗 Thanks 如果没有更多关于您的
  • 从文件夹中读取java文件

    我开发了一个应用程序 可以从用户选择的文件夹中读取文件 它显示每个文件中有多少行代码 我只想在文件选择器中显示 Java 文件 具有 java 扩展名的文件 下面是我的代码 public static void main String ar
  • 接受 05/05/1999 和 5/5/1999 等的日期时间解析

    有没有一种简单的方法来解析可能为 MM DD yyyy M D yyyy 或某种组合的日期 即 在一位数字的日期或月份之前 零是可选的 要手动执行此操作 可以使用 String dateFields dateString split int
  • 纹理映射和光照顶点着色器错误 Java OpenGL

    我正在尝试将纹理映射到 3D 立方体并尝试编写着色器以使其具有照明和纹理 我尝试过只编写纹理着色器并且它有效 我还尝试过仅将 3D 值设置为红色的照明着色器 并且该照明着色器也可以工作 但当我尝试将两者结合起来时 我遇到了问题 我在下面提供
  • JarSplice 的命令行参数?

    罐子接头 http ninjacave com jarsplice允许将 jar 文件以及其他依赖项和库聚合到一个可执行 jar 文件中 但是 我的可执行 jar 需要两个命令行参数 当我调用 JarSplice jar 时 这两个参数似乎
  • 如何在 JTextArea 中设置部分文本颜色?

    我想为文本区域中的特定行设置颜色 到目前为止我发现的是以下内容 Declarations private final DefaultStyledDocument document private final MutableAttribute
  • 为什么 java.io.File 没有 close 方法?

    While java io RandomAccessFile确实有一个close method java io File没有 这是为什么 文件在完成时会自动关闭吗 javadoc 的Fileclass 将该类描述为 文件和目录路径名的抽象表

随机推荐

  • 佛祖保佑 永不宕机 永无BUG C语言 串口打印

    字符串如下 char log oo0oo r n o8888888o r n 88 88 r n r n 0 0 r n r n r n
  • ChromeDriver最新版(116.x及最新)下载途径分享

    首先查看version 在地址栏输入chrome version 最新版 官方地址 https googlechromelabs github io chrome for testing 选择合适的下载即可 Old 官网 https chr
  • 关于postman使用技巧

    一 get方法 只在此显示下有token的查询方法 一般的get查询直接浏览器地址即可 二 post请求 1 在headers中设置下Content Type为application json 2 在Body中输入正确的json格式即可 三
  • 从零实现DevOps(二):Centos7操作系统-环境变量配置(JDK、Maven、Node)

    1 JDK安装并配置环境变量 由于Jenkins官网要求 从2 357版本后必须用java11或17才可以运行 java8运行会报错 所以我们直接安装jdk11 1 下载地址 往下拉可以找到Java11 Java Downloads Ora
  • C语言速成指南

    说明一下吧 这篇文章是用于c语言有目的的速成 有点基础的看一看也可以当复习 如果想要真正学好c语言 建议看一下之前写的详细教程 这篇文章会有很多对于考试没有多大帮助的东西被忽略掉 临近期末祝大家考试顺利 我也会不断完善这篇文章的 欢迎各路大
  • SQLMap 注入 DVWA实战

    一 low级别 1 进入dvwa界面输入1 点击Submit 得到链接 http localhost dvwa master vulnerabilities sqli id 1 Submit Submit 2 我们用sqlmap进行爆破 s
  • springboot 配置多个请求服务代理

    springboot 配置服务代理 有时候 我们可能有下边这样的需求 即 针对于分布式服务 我们会有多种业务接口服务 但是服务器上可能只要求开放一个服务的端口 比如上图的restA项目端口是对外开放的 但是restB项目端口并未对外开放 这
  • StringBuffer与StringBuilder的区别

    StringBuffer与StringBuilder的区别 一 String StringBuffer与StringBuilder String字符串常量 String的值是不可变的 这就导致每次对String的操作都会生成新的String
  • 运算符优先级

    C语言中 运算符除了常见的三大类 算术运算符 关系运算符与逻辑运算符之外 还有一些用于完成特殊任务的运算符 运算符的运算优先级共分为15 级 1 级最高 15 级最低 在表达式中 优先级较高的先于优先级较低的进行运算 而在一个运算量两侧的运
  • 我爱Java系列之《JavaEE学习笔记day12》---【缓冲流、转换流、序列/反序列化流、打印流】

    一 缓冲流 1 字节缓冲输出流java io BufferedOutputStream extends OutputStream 高效字节输出流 写入文件 目标文件 底层定义个了一个长度为8192的数组 提高效率 常用方法 write in
  • lvm扩容是否影响oracle,linux下对LVM扩容

    扩容原因 dev vg rhel64 lv root 占用率达到100 导致部分应用无法继续运行 操作过程 1 关闭系统 在虚拟机中添加一块10G的磁盘 2 查看新添加磁盘对应的名称 email protected fdisk cul 得知
  • 人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法

    1 SFT 监督微调 1 1 SFT 监督微调基本概念 SFT Supervised Fine Tuning 监督微调是指在源数据集上预训练一个神经网络模型 即源模型 然后创建一个新的神经网络模型 即目标模型 目标模型复制了源模型上除了输出
  • nodejs安装和环境配置-Windows

    0 安装过程中遇到的常见问题 访问 https blog csdn net weixin 52799373 article details 125718587 spm 1001 2014 3001 5502 1 下载node js 下载地址
  • 向数据库插入数据、修改数据时自动生成时间以及自动修改时间

    数据库中列名为 created 用于自动记录 数据添加 的时间 其数据类型为 timestamp 默认为 CURRENT TIMESTAMP 修改成功后 下次添加新的数据 该列会自动记录系统时间 CREATE TABLE example i
  • Keycloak 登录方案

    转自 Keycloak 13 自定义用户身份认证流程 User Storage SPI Zhang Xiang 博客园
  • 管理系统 -----sku

    目录 skuform静态页面 ui下拉框 reduce 方法详解及高级技巧 语法 reduce的简单用法 reduce的高级用法 项目实战应用 SKUFORM完整代码 完成查看SKU列表的loading效果 spu父组件 sku页面 深度选
  • 字节跳动面试分享,android内存优化面试题

    一 开发背景 想要成为一名优秀的Android开发 你需要一份完备的知识体系 在这里 让我们一起成长为自己所想的那样 我们的项目需要开发一款智能硬件 它由 Web 后台发送指令到一款桌面端应用程序 再由桌面程序来控制不同的硬件设备实现业务上
  • Node.js入门:Buffer对象学习

    前言 计算机底层存储的数据都是二进制的 在前端开发中一般都是实现页面效果 很少会直接操作二进制的数据 而在 Node js 擅长的领域 比如在服务端程序开发中 经常会读取文件 处理文件 和二进制数据打交道比较多 Buffer 对象是 Nod
  • 解决SSH连接时提示server responded connection closed

    这个问题折腾了我大半天 脑子太呆板 搜了一大堆的资料都不管用 其实很简单 卸载重装就完事了 真笨 SSH连接时提示server responded connection closed The connection to the remote
  • 2022-04-03 面试题:synchronized 部分原理+常量池部分问题+自动装箱/http 部分问题

    2022 04 03 synchronized 部分原理 常量池部分问题 自动装箱 http 部分问题 部分整理参考来自 https blog csdn net zzti erlie article details 86587263 utm