最近正在准备面试,网上查了许多的面试题,但是却都很少有相关答案。因此特意在这里整理一份题型以及我自己填充的部分答案,如果有错误,或者部分我不知道结果的题目,可以请大家私信或评论我调整。同时本内容也会不定期进行更新,为了方便检索,会在前面先写问题和问题序号,下面会再写答案。其他相关内容spring、redis、数据库等稍后会一一进行编写。
侵删。
青藤门下走狗:Java常见面试题整理(带答案)——spring9 赞同 · 0 评论文章
青藤门下走狗:Java常见面试题整理(带答案)——基础篇95 赞同 · 4 评论文章
多线程问题
多线程答案
1.如何创建线程
线程可以有三种创建方式:
实现Runnable接口,重写里面的run()方法
继承Thread类,重写里面的Run()方法
实现Call接口,重写里面的call()方法。
2.为什么会存在线程安全
多个线程对同一个公共资源的资源竞争。
3.什么是原子性,什么是可见性
原子性:操作是不可中断的,要么全部成功,要么全部失败。
可见性:一个线程修改了共享变量,其他的线程能马上得到通知。
4.Synchronized有几种使用方式,区别是什么
可以使用在方法上和使用在代码块上。
区别:同步方法一次只能有一个线程访问该方法,而在方法中使用同步代码块,可以一次有多个线程访问同一个方法,只不过在访问同步代码块的时候一次只能由一个线程访问。
5.悲观锁和乐观锁的概念
乐观锁:乐观地认为所有的并发操作都是线程安全的,不需要加锁来处理。但为了保证数据没有被修改,会通过CAS操作来进行判定和替换。
悲观锁:悲观地认为所有的并发操作都是线程不安全的,都需要加锁来保证线程安全。
6.JDK对锁的优化
JKD1.6之后增加了锁粗化、锁消除、偏向锁、轻量级锁、重量级锁来对锁进行一个优化。
锁粗化:对一系列的加锁操作,如果是针对同一个资源的锁的获取和释放,可以对这些代码统一放到一个更大的锁范围内。
锁消除:对一些列不会引发线程安全问题的操作进行加锁,JDK会自动取消加锁和释放锁。
偏向锁:这是对Synchronized的优化,从无锁状态到第一次被线程获得锁,会先进入偏向锁状态,如果一直是同一个线程获取锁,则会一直处于偏向锁,直到发生竞争。这只是一个标志,而不是真正的锁。标记中有一个指针指向了当前获取锁的线程的地址,如果地址相同,则判定是同一个线程。如果有其他线程来获取锁,会检查前一个线程是否仍存活(偏向锁不会主动释放),如果存活则膨胀变成轻量级锁。如果不存活,则会从偏向锁变成无锁状态,再由线程去获取锁,如果获取失败,产生了竞争,则也膨胀成轻量级锁。
轻量级锁:这是对Synchronized的优化,从偏向锁的状态发生竞争后,会锁膨胀变成轻量级锁。轻量级锁是在内存有一个锁记录,当某个线程获取到锁后,会将锁记录保存到线程内存中,同时将原本的锁记录指向它的线程内存中的备份锁记录位置。其他线程判断锁记录已经指向了其他线程,因此会进入自旋状态。达到一定的次数或时间后,会膨胀变成重量级锁。
重量级锁:重量级锁是指的监视器锁,这是底层计算机来实现的一个锁,每次的获取和释放,需要消耗大量CPU资源。
7.ReentrantLock和Synchronized区别
(1)ReentrantLock是JDK提供的锁,Synchronized是JVM提供的锁。
(2)R需要编程人员手动进行锁的获取和释放,如果在代码块中出现异常,不会自动释放锁,需要由编程人员在finally中确保释放锁。S则会自动地释放锁。
(3)S是悲观锁和非公平锁和独享锁,而R可以配置公平锁和非公平锁,同时也可以有共享锁和CAS的乐观锁实现。
8.ThreadLocal原理
ThreadLocal采用的是每个线程都复制一份数据的方式来保证数据的安全性。
在ThreadLocal中有一个内部类ThreadLocalMap,以K-V形式来存放数据。同时在Thread类中,有它的一个对象。我们在线程中每次对ThreadLocal赋值,都是先获取当前线程thread,然后将值赋予在thread中的ThreadLocalMap对象中,key是当前的ThreadLocal对象,值是我们需要存储的数据。
9.ThreadLocal缺点
ThreadLocal由于真正存储数据的ThreadLocalMap只单纯地采取了数组的形式来存储数据,因此出现hash冲突时会进行线性寻找位置,会导致大量的hash冲突,造成很高的资源消耗。
同时由于ThreadLocal类是弱引用,可能会存在ThreadLocalMap中的key——ThreadLocal已经被回收了,但是它的Value依然存在,从而导致大量的对象没有办法回收,会出现内存溢出的情况。因此,实际会在操作结束后,对其进行clear,清理key为null的位置。
原网址: 访问
创建于: 2022-10-13 10:30:21
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论