面试突击1

1.当线程没有拿到资源时,用户态和内核态的一个切换

操作系统中,进程线程是执行程序的基本单位。为了管理这些单位,操作系统使用了一种称为“进程状态”的机制,其中包括用户态和内核态两种状态。这两种状态代表了进程或线程在执行时的不同权限和上下文。

用户态(User Mode): 当进程或线程在用户态下运行时,它们只能访问受限的资源,例如它们自己的内存空间、文件、网络等。这是为了保护系统的稳定性和安全性,防止进程或线程意外地或恶意地访问其他进程或系统的核心资源。
**内核态(Kernel Mode):**当进程或线程需要执行一些特权操作,如访问硬件、修改其他进程的内存或执行系统调用时,它们会切换到内核态。在内核态下,进程或线程具有更高的权限,可以访问系统的核心资源。
现在,关于线程没有拿到资源时从内核态到用户态的转换:

当线程尝试获取某个资源(如内存、文件、网络套接字等)但未能成功时(例如,由于资源不足或资源已被其他线程占用),线程可能会执行一个系统调用,请求操作系统帮助获取该资源。这个系统调用会导致线程从用户态切换到内核态。在内核态下,操作系统会检查资源的情况,并决定是否满足线程的请求。如果资源不可用或无法满足线程的需求,操作系统会返回一个错误码给线程,告诉它无法获取资源。

一旦线程收到了这个错误码,它就知道它没有成功获取资源。然后,操作系统会将线程从内核态切换回用户态,让线程继续执行。

这种从用户态到内核态的转换和切换是操作系统管理和调度进程或线程的基本机制之一。它允许操作系统对进程或线程的行为进行监控和控制,确保系统的稳定性和安全性。

2.Synchronized

1.synchronized能保证原子性,有序性,可见性:

2.1加锁原理:

synchronized加锁原理:使用synchronized之后,当执行同步代码块前首先要先执行monitorenter指令,退出的时候monitorexit指令 ,其关键就是必须要对对象的监视器monitor进行获取 ,当线程获取monitor后才能继续往下执行,否则就只能等待。而这个获取的过程是互斥的,即同一时刻只有一个线程能够获取到monitor 。

2.2monitor 到底是什么?

Monitor在Java中是一个用于实现线程同步的机制,通常与synchronized关键字关联。Monitor内部包含了一个对象头(Object Header)和一块同步代码块。当线程尝试进入同步代码块时,它首先需要获得对象的monitor锁。如果锁被其他线程持有,则当前线程会被阻塞,直到获得锁为止。

具体来说,1.当一个线程尝试进入synchronized代码块时,它会尝试获取对象的锁。这个锁的状态信息存储在对象的对象头中。如果锁是偏向锁或轻量级锁,并且可以由当前线程获取,那么线程就会继续执行同步代码块。——>2.``如果锁已经升级为重量级锁,或者当前线程无法获取轻量级锁,那么就会涉及到Monitor的机制

在这种情况下,对象的对象头会被修改为指向一个Monitor对象(在JVM内部实现),这个Monitor对象包含了等待队列和锁的所有者信息。当前线程如果无法获取锁,就会被放入Monitor的等待队列中阻塞等待。当锁被释放时,Monitor会负责唤醒等待队列中的一个线程,并让它尝试获取锁。

2.2.1对象头里面有什么?

1.Mark Word:用于存储对象自身的运行时数据,如·哈希码(HashCode)、GC分代年龄、锁状态标志线程持有的锁偏向线程ID偏向时间戳等。这些信息都是用于Java对象的内存管理和并发控制。
2.Klass Word (或称为元数据类型指针):指向对象的类元数据(也就是方法区中的类型信息),虚拟机通过这个指针来确定这个对象是哪个类的实例。
可以通过这个指针——>对应的
类对象
(这个类对象可以找到InstanceKlass)
——>字节码文件加载到内存时就会得到Class对象(也就是镜像类)
,里面有InstanceKlass的地址,指向InstanceKlass(保存在方法区),从而获取字节码文件中的内容(也就是各种类信息)

2.2.2KlassWord指针和反射的区别:

1.反射:是Java提供的一种能力,允许程序在运行时获取和操作对象的内部属性、方法等信息。它通常涉及到使用java.lang.reflect包中的类,如Class、Method、Field等;它允许程序在运行时动态地访问和操作这些类元数据。例如,通过反射,您可以获取一个对象的Class对象然后进一步获取该类的所有方法、字段、构造函数等信息,甚至可以动态地调用方法和访问字段。

2.KlassWord:过程是Java对象实例化时的一部分,涉及到对象头的Klass Word(或称为元数据类型指针)和类元数据的加载。这个过程发生在对象创建时,由JVM自动处理,用于确定对象所属的类,以及该类在方法区中的元数据。这是Java对象模型的一部分,用于支持对象的类型识别和类型安全。
在这里插入图片描述

2.3 synchronized并发获取锁的过程

在这里插入图片描述

2.3.1 在多个线程竞争synchronized锁资源时,是公平还是非公平?那你是如何理解这种现象

synchronized关键字的非公平性确实可能导致线程饥饿的情况。当一个线程尝试获取synchronized锁时,它不会等待其他已经等待很久的线程,而是会立即尝试获取锁。如果它成功获取了锁,那么即使有其他线程已经在等待队列中等待了很长时间,它们也必须继续等待

2.4 synchronized的优化

2.4.1首先阐述 偏向锁和轻量型锁以及重量型锁之间的转换:

1.偏向锁(Biased Locking):
当同步代码块第一次被访问时,JVM会尝试使用偏向锁。在对象头中记录当前线程的ID,作为偏向锁。偏向锁是为了减少无竞争的锁获取和释放的开销。如果同步代码块在后续的执行中没有被其他线程访问,那么偏向锁就会持续保持。

2.轻量级锁(Lightweight Locking):
同步代码块出现竞争时(即多个线程尝试同时访问),偏向锁会升级为轻量级锁(轻量级锁是通过在对象头中存储一个指向线程栈锁记录指针来实现的——>如果此时原来的线程不再持有该锁新的线程通过CAS操作尝试将对象头的锁记录指针指向自己的锁记录,从而获取锁)。轻量级锁是为了减少线程挂起和恢复的开销。在轻量级锁下,线程会尝试通过自旋(忙等待)的方式获取锁,而不是直接阻塞。如果自旋成功,则线程获得锁并执行同步代码块。如果自旋失败(即锁仍被其他线程持有),则轻量级锁可能会进一步升级为重量级锁(锁膨胀)。

在这里插入图片描述
Cas的本质就是比较对象头并且交换(有性能损耗,看对象头中的锁状态是00否);——>就像反书包一样,每次都得翻一下书包看一下是否是自己名字

3.重量级锁(Heavyweight Locking):
当轻量级锁自旋超过一定的次数(通常取决于JVM的实现和配置)或者有其他线程在等待获取锁时,轻量级锁会升级为重量级锁。重量级锁会导致线程阻塞,并在需要时由操作系统进行调度。重量级锁的开销相对较大,因为它涉及到线程的挂起和恢复。

1.如果两个或更多的线程同时尝试获取轻量级锁,并且自旋等待(忙等待)超过了预设的次数,或者有一个线程已经持有锁而其他线程在等待,轻量级锁就会膨胀为重量级锁。
2.在这个过程中,对象头会发生变化,不再直接指向线程的锁记录,而是指向一个Monitor对象。
Monitor对象包含了等待队列(EntryList)和持有锁的线程(owner)等信息。
3.未能获取锁的线程会被放入Monitor的等待队列中,并阻塞等待锁的释放。
4.当持有锁的线程释放锁时,它会通过Monitor的机制来唤醒等待队列中的一个线程,该线程随后会尝试获取锁并继续执行。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过玩游戏学会AWS

游戏名字: Cloud Quest 类型:亚马逊云科技官方出了一款 3D 角色扮演、虚拟城市建造形式的游戏实验课 进入方法:浏览器搜索 Cloud Quest(或扫描下方二维码)进入 Cloud Quest 课程页。 选择以下的链接 点击进行注册 进…

Java Web 中forward 和 redirect 的区别

前言 在Java Web开发中,页面跳转是构建用户界面和实现业务逻辑的重要组成部分。Forward(转发)和Redirect(重定向)是两种常见的跳转方式,它们分别具有不同的特点和适用场景。正确地选择和使用这两种跳转方式…

拿捏c语言指针(上)

目录 前言 ​编辑 指针 内存与地址 计算机常见单位 理解编址 取地址,指针变量,解引用 取地址 指针变量 解引用 指针变量大小 指针类型的作用 char*解引用后 指针-整数 应用 void*指针 const修饰指针变量 const修饰普通变量 const修饰指…

C++数据结构与算法——字符串

C第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更…

在已有代码基础上创建Git仓库

在已有代码基础上创建Git仓库 背景方法处理问题 背景 先进行了代码编写,后续想放入仓库方便大家一起合作开发,此时需要在已有代码的基础上建立仓库。 方法 首先在Gitee或者GitHub上创建仓库,这里以Gitee为例。创建完后,我们可以…

java8-用optional取代nu11

本章内容口nu11引用引发的问题,以及为什么要避免nu11引用从nu11到optiona1:以nu11安全的方式重写你的域模型让optiona1发光发热:去除代码中对nu11的检查 读取optiona1中可能值的几种方法口对可能缺失值的再思考 如果你作为Java程序员曾经遭遇过Nu11PointerException…

Excel导入预览与下载

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Excel导入预览与下载 preview Controller PostMapping("preview")ApiOperation("上传拒付预警预览")public Result<List<ResChargebackWa…

猫头虎分享已解决Bug ‍ || Java Error: Could not find or load main class com.example.Main

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

每日OJ题_算法_递归③力扣206. 反转链表

目录 力扣206. 反转链表 解析代码 力扣206. 反转链表 206. 反转链表 LCR 024. 反转链表 难度 简单 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,…

基于Java (spring-boot)和微信小程序的奶茶点餐小程序

一、项目介绍 基于Java (spring-boot)和微信小程序的奶茶点餐小程序功能&#xff1a;客户端登录、个人中心、点餐、选规格、去结算、取餐、我的信息、管理员登录、管理员首页、用户管理、商品管理、商品编辑、商品种类、订单管理、订单处理、等等等。 适用人群&#xff1a;适合…

MessageQueue --- RabbitMQ

MessageQueue --- RabbitMQ RabbitMQ IntroRabbitMQ 核心概念RabbitMQ 分发类型Dead letter (死信)保证消息的可靠传递 RabbitMQ Intro 2007年发布&#xff0c;是一个在AMQP&#xff08;高级消息队列协议&#xff09;基础上完成的&#xff0c;可复用的企业消息系统&#xff0c;…

Netty Review - 底层零拷贝源码解析

文章目录 Pre概述源码解析入口索引AbstractNioByteChannel.NioByteUnsafe#readallocHandle.allocate(allocator) 小结传统的零拷贝 Pre Netty Review - 直接内存的应用及源码分析 概述 Netty 的零拷贝技术是通过优化数据传输过程中的数据复制操作&#xff0c;以降低系统的开销…

Java 基于 SpringBoot+Vue 的酒店管理系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Java微服务架构的选择:Spring Cloud、Kubernetes还是Kubernetes + Istio?

微服务架构已经成为现代软件开发的趋势&#xff0c;其可以带来高度可伸缩性、松耦合性和团队自治性等优势。 在Java开发领域中&#xff0c;选择适合的微服务架构是非常关键的决策&#xff0c;本文将探讨Spring Cloud、Kubernetes和KubernetesIstio这三个架构选择的优势和劣势。…

抽象的前端

问题背景&#xff1a;vue3&#xff0c;axios 直接导致问题&#xff1a;路由渲染失败 问题报错&#xff1a;Uncaught SyntaxError: The requested module /node_modules/.vite/deps/axios.js?v7bee3286 does not provide an export named post (at LoginIn.vue:16:9) 引入组…

[NSSRound#16 Basic]Web

1.RCE但是没有完全RCE 显示md5强比较&#xff0c;然后md5_3随便传 md5_1M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&md5_2M%C9h%FF%0E%E3%5C%20%95r%D4w…

Spring AOP的实现方式

AOP基本概念 Spring框架的两大核心&#xff1a;IoC和AOP AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程&#xff09; AOP是一种思想&#xff0c;是对某一类事情的集中处理 面向切面编程&#xff1a;切面就是指某一类特定的问题&#xff0c;所以AOP可…

CMake进行C/C++与汇编混合编程

1. 前提 这篇文章记录一下怎么用CMake进行项目管理, 并用C/C和汇编进行混合编程, 为了使用这项技术, 必须在VS的环境中安装好cmake组件 由于大部分人不会使用C/C与汇编进行混合编程的情况。所以这篇文章并不适用于绝大部分人不会对其中具体细节进行过多叙述。只是做一些简单的…

Java的集合框架和泛型

文章目录 集合框架什么是集合框架类和接口总览 集合框架的重要性背后所涉及的数据结构以及算法什么是数据结构容器背后对应的数据结构什么是算法 包装类基本数据类型和对应的包装类装箱和拆箱自动装箱和自动拆箱 泛型什么是泛型引出泛型语法泛型类泛型的上界(没有下界)泛型方法…

知识图谱:py2neo导入周杰伦歌单csv文件

文章目录 py2neo导入csv文件py2neo导入周杰伦歌单csv效果展示 py2neo导入csv文件 之前写的知识图谱指南 知识图谱&#xff1a;py2neo将csv文件导入neo4j 因为没有区分不同实体entity的类型&#xff0c;所以颜色相同&#xff0c;无法相互区分歌手、歌曲还是专辑等等。 py2ne…