java日常工作开发高并发问题

news2024/12/23 17:43:16

前言

  本篇文章将是以工作中经常遇到的问题,和面试中经常遇到的java问题进行描写。内容包括微服架构,java并发编程以及相应的中间件的高级知识。本文所有的问题都在描述多线程编程的高级知识。

一. 面试题

1.Sychronized和ReentrantLock有哪些不同点?

SychronizedReentrantLock
java的关键字 ,JVM层面的锁JDK提供的一个类,API层面的锁
自动加锁,自动释放锁手动加锁,手动释放锁
不可获得当前线程是否上锁可获得当前线程是否上锁,isHeldByCurrentThread
非公平锁公平锁或非公平锁(在实现ReentrantLock锁时,可添加一个Boolean参数是否需要公平)
不可中断可中断:1:调用设置超时方法tryLock(long timeout,timeUnit unit)2:调用locklnterruptibly()放到代码块中,然后调用interrupt()方法可以中断
锁的是对象int类型的state标识来标识锁升级的状态
锁信息保存在对象头中底层有锁升级的过程没有锁升级过程

2.ThreadLocal有哪些应用场景?它底层是如何实现的?
  ThreadLocal是Java中所提供的线程本地存储机制,可以利用该机制将数据缓存在某个线程内部,该线程可以在任意时刻、任意方法中获取缓存的数据。
在这里插入图片描述
  如下数据结构图所示,ThreadLocal的底层实现是一个,ThreadlocalMap,是一个entry对象,key是threadlocal,value:需要缓存的值。
  如果在线程池中使用ThreadLocal会造成内存泄漏,因为当ThreadLocal对象使用完之后,应3.该要把设置的key,value,也就是Entry对象进行回收,但线程池中的线程不会回收,而线程对象是通过强引用指向ThreadLocalMap,ThreadLocalMap也是通过强引用指向Entry对象线程不被回收,Entry对象也就不会被回收,从而出现内存泄,解决办法是,在使用了ThreadLocal对象之后,手动调用ThreadLocal的remove方法,手动清楚Entry对象。
在这里插入图片描述
  当一个共享变量是共享的, 但是需要每个线程互不影响,相互隔离, 就可以使用ThreadLocal。
1)跨层传递信息的时候,每个方法都声明一个参数很麻烦,A\B\C\D 3个类互相传递每个方法都声明参数降低了维护性,可以用一个ThreadLocal共享变量,在A存值,BCD都可以获取。
2)隔离线程,存储一些线程不安全的工具对象,如(SimpleDateFormat)。
3)spring中的事务管理器就是使用的ThreadLocal。
4)springmvc的HttpSession、HttpServletReugest、HttpServletResponse都是放在ThreadLocal,因为servlet是单例的,而springmvc允许在controller类中通过@Autowired配置request、response以及requestcontext等实例对象。底层就是搭配Threadlocal才实现线程安全。
3.ReentrantLock分为公平锁和非公平锁,那底层分别是如何实现的?
  首先不管是公平锁和非公平锁,它们的底层实现都会使用AQS来进行排队,它们的区别在于线程在使用lock()方法加锁时:
  1)如果是公平锁,会先检查AQS队列中是否存在线程在排队,如果有线程在排队,则当前线程也进行排队
  2)如果是非公平锁,则不会去检查是否有线程在排队,而是直接竞争锁。
  另外,不管是公平锁还是非公平锁,一旦没竞争到锁,都会进行排队,当锁释放时,都是唤醒排在最前面的线程,所以非公平锁只是体现在了线程加锁阶段,而没有体现在线程被唤阶段,ReentrantLock是可重入锁,不管是公平锁还是非公平锁都是可重入的。
4.Sychronized锁的升级过程是怎么样的?
  对象头会记录Sychronized的状态,状态偏向锁、轻量级锁、重量级锁。
  1)偏向锁:在锁对象的对象头中记录一下当前获取到该锁的线程ID,该线程下次如果又来获取该锁就可以直接获取到了,也就是支持锁重入。
  2)轻量级锁:当两个或以上线程交替获取锁,但并没有在对象上并发的获取锁时,偏向锁升级为轻量级锁。在此阶段,线程采取CAS的自旋方式尝试获取锁,避免阻线程造成的cpu在用户态和内核态间转换的消耗。
  3)两个或以上线程并发的在同一个对象上进行同步时,为了避免无用自旋消耗cpu,轻量级锁会升级成重量级锁。
  4)自旋锁:自旋锁就是线程在获取锁而定时候,不会堵塞线程,也就是所谓唤醒线程,阻塞和唤醒这两个步骤是需要操作系统去进行的,比较消耗时间。即不断循环检查锁的状态,直到成功获取锁或达到一定的尝试次数。这种机制的核心思想是通过快速尝试获取锁来减少线程切换的开销,提高并发性能。

结束语

  本篇文章主要介绍了ReentrantLock和Sychronized的差异,和他们的具体实现,Sychronized锁的升级过程,锁状态放在对象头中,循环获取锁的状态。ReentrantLock的公平锁与不公平锁如何实现等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2264351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】【数据分析】深入探索 Python 数据可视化:Matplotlib 绘图库完整教程

目录 引言一、什么是 Matplotlib?1.1 Matplotlib 的安装1.2 Matplotlib 的基本功能 二、Matplotlib 的基础绘图2.1 绘制折线图2.2 绘制柱状图2.3 绘制散点图2.4 绘制饼图 三、高级功能与定制3.1 设置图表样式3.2 使用子图3.3 保存图表 四、Matplotlib 流程图4.1 Mer…

【代码随想录|动态规划背包问题】

一、背包问题分类 01背包:n种物品,每种物品只有一个 完全背包:n种物品,每种物品有无限个 多重背包:n种物品,每种物品的个数各不相同 二、01背包问题三道题 卡码网46题.携带研究材料(二维背包…

第1章 命题逻辑

2024年12月22日 一稿 1.1 现代逻辑学的基本研究方法 1.2 命题及其表示法 1.2.1 命题的概念 定义1.1 命题是一个可以判断真假的陈述句。 1.2.2 联结词 非 与 或 蕴含 等价 1.3 命题公式与语句形式化 1.3.1 命题公式的定义 1.3.2 公式的层次 1.3.3 语句形式化 1…

Unity-Editor扩展GUI基本实现一个可拖拉放的格子列表

短短几百行代码,好吧,又是“参考”了国外的月亮 操作,还真地挺自然的。。。。。。国外的实现有点小牛 拖拉,增加+ 一个Element 鼠标左键长按,可以出提示 鼠标右键,清除Element, 有点小bug,不是很自然地完全清除, using System.Collections; using System.Collecti…

解决vscode ssh远程连接服务器一直卡在下载 vscode server问题

目录 方法1:使用科学上网 方法2:手动下载 方法3 在使用vscode使用ssh远程连接服务器时,一直卡在下载"vscode 服务器"阶段,但MobaXterm可以正常连接服务器,大概率是网络问题,解决方法如下: 方…

重拾设计模式--外观模式

文章目录 外观模式(Facade Pattern)概述定义 外观模式UML图作用 外观模式的结构C 代码示例1C代码示例2总结 外观模式(Facade Pattern)概述 定义 外观模式是一种结构型设计模式,它为子系统中的一组接口提供了一个统一…

jvm栈帧结构

JVM(Java虚拟机)中的虚拟机栈是线程私有的,用于支持Java虚拟机进行方法调用和方法执行。而栈帧(Stack Frame)则是虚拟机栈的基本元素,每一个方法从调用开始至执行结束的整个过程,都对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。栈帧的内部结构主要包括以下几个部分:…

2009 ~ 2019 年 408【计算机网络】大题解析

2009 年 路由算法(9’) 讲解视频推荐:【BOK408真题讲解-2009年(催更就退网版)】 某网络拓扑如下图所示,路由器 R1 通过接口 E1 、E2 分别连接局域网 1 、局域网 2 ,通过接口 L0 连接路由器 R2 &…

Flamingo论文介绍:把视觉特征向语言模型看齐

今天介绍一篇经典的多模态论文,来自NeurIPS 2022的《Flamingo: a Visual Language Model for Few-Shot Learning》 ,论文地址:https://arxiv.org/pdf/2103.00020 文章目录 一、Motivate二、Method三、模块细节:Perceiver Resampl…

【VSCode】常用插件汇总

1 Path Autocomplete(路径提示的插件) 步骤一:在vscode的扩展搜索中直接搜索Path Autocomplete,直接安装 步骤二:配置 配置 VS Code settings.json "path-autocomplete.pathMappings": {"": &q…

STM32F103 | Embedded IDE03 - 使用OpenOCD在STM32F103项目时出现下载固件失败

导言 在上一篇备忘录介绍使用OpenOCD的stlink-v2.cfg接口下载固件,在STM32F407的项目上很顺利。但是,在stm32f103上会出现下载失败。 在网上搜了一下,这位博主的文章解决了这个问题: https://www.iotword.com/26738.html 一、修改stm32f1x.c…

易语言 OCR 文字识别

一.引言 文字识别,也称为光学字符识别(Optical Character Recognition, OCR),是一种将不同形式的文档(如扫描的纸质文档、PDF文件或数字相机拍摄的图片)中的文字转换成可编辑和可搜索的数据的技术。随着技…

Linux 网络维护相关命令简介

目录 零. 概要一. ping二. ip命令2.1 ip address2.2 ip route2.3 ip neighbour 三. traceroute四. DNS查询4.1 nslookup4.2 dig 五. ss 查看网络连接状态 零. 概要 ⏹在Linux系统中有2套用于网络管理的工具集 net-tools 早期网络管理的主要工具集,缺乏对 IPv6、网…

vscode中同时运行两个python文件(不用安装插件)

如何在vscode中同时运行两个python文件呢?今天在工作中遇到了这个问题。 查了网上的方法是安装coder runner插件,后来发现自身就有这个功能。所以记录一下,方便后续查找: 这是我的第一个文件,点击右上角的运行旁边的小箭头,有一…

matlab绘图时设置左、右坐标轴为不同颜色

目录 一、需求描述 二、实现方法 一、需求描述 当图中存在两条曲线,需要对两条曲线进行分别描述时,应设置左、右坐标轴为不同颜色,并设置刻度线,且坐标轴颜色需要和曲线颜色相同。 二、实现方法 2.1、实现目标: 1…

解决Apache/2.4.39 (Win64) PHP/7.2.18 Server at localhost Port 80问题

配置一下apache里面的配置文件:httpd.conf 和 httpd.vhosts.conf httpd.conf httpd-vhosts.conf 重启服务 展示: 浏览器中中文乱码问题:

RunCam WiFiLink连接手机图传测试

RunCam WiFiLink中文手册从这里下载 一、摄像头端 1.连接天线(易忘) 2.打开摄像头前面的盖子(易忘) 3.接上直流电源,红线为正,黑线为负 4.直流电源设置电压为14v,电流为3.15A, 通…

用JAVA做了一个登录窗体练习

目 录 说明运行后的效果代码 说明 做了一个登录窗体作为练习,分享给大家,其中涉及到窗体、图板、随机数等内容,为了方便和我一样的小白可以看的比较明白,所以尽量详细的标注了注释,希望能帮到同样在学习路上的朋友 运…

《开启微服务之旅:Spring Boot 从入门到实践》(一)

Spring Boot Spring Boot 入门 Spring Boot 简介(脚手架) 简化Spring应用开发的一个框架; 整个Spring技术栈的一个大整合; J2EE开发的一站式解决方案; 优点:快速创建独立运行的spring项目以及与主流…

springboot466大学生就业服务平台(论文+源码)_kaic

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统大学生就业服务平台信息管理难度大,容错率低&…