上下文切换
在并发编程中,并不是线程越多就效率越高,线程数太少可能导致资源不能充分利用,线程数太多可能导致竞争资源激烈,然后上下文切换频繁造成系统的额外开销。那什么是上下文切换呢?
什么是上下文切换?
在处理多线程并发任务时,处理器会给每个线程分配CPU时间片,线程在各自分配的时间片内占用处理器并执行任务,当线程的时间片用完了,或者自身原因被迫暂停运行的时候,就会有另外一个线程来占用这个处理器,这种一个线程让出处理器使用权,另外一个线程获取处理器使用权的过程就叫做上下文切换。
一个线程让出CPU处理器使用权,就是“切出”;另外一个线程获取CPU处理器使用权。就是“切入”,在这个切入切出的过程中,操作系统会保存和恢复相关的进度信息,而这个进度信息就是我们常说的“上下文”,上下文一般包含了寄存器的存储内容以及程序计数器存储的指令内容。
对于单核单线程 CPU 而言,在某一时刻只能执行一条 CPU 指令。从用户角度看,计算机能够并行运行多个进程,这恰恰是操作系统通过快速上下文切换造成的结果。每个时间片的大小一般为几十毫秒,所以在一秒钟就可能发生几十上百次的线程相互切换,给我们的感觉就是同时进行的
Java 多线程的上下文切换
在 Java 中,多线程的上下文切换就是多线程两个运行状态的相互切换导致的。在切换时操作系统保存上下文信息,当线程从 BLOCKED 状态进入到 RUNNABLE 时,也就是线程的唤醒,此时线程将获取上次保存的上下文信息,接着之前的进度继续执行。
在 Java 中,两种情况会导致上下文切换:一种是自发性上下文切换,也就是程序本身触发的切换;另一种是非自发性上下文切换,也就是系统或者虚拟机导致的上下文切换。
(1)自发性上下文是线程由 Java 程序调用导致切出,一般是在编码的时候,调用以下几个方法或关键字:
sleep()、wait()、yield()、join()、park()、synchronized、lock
(2)非自发的上下文切换常见的有:线程被分配的时间片用完,虚拟机垃圾回收导致,或者执行优先级的问题导致
上下文切换的系统开销
- 操作系统保存和恢复上下文
- 处理器高速缓存加载
- 调度器进行调度
- 上下文切换可能导致的高速缓冲区被冲刷
小结
上下文切换就是一个线程释放处理器的使用权,另外一个线程获取处理器的使用权的过程;在切入切出时,系统会保存和读取当前线程的上下文信息,用户恢复线程的执行进度;自发和非自发的调用操作,都会导致上下文切换,会导致系统资源开销。
线程越多不一定执行的速度越快,在单个逻辑比较简单的时候,而且速度相对来说非常快的情况下,我们推荐是使用单线程。如果逻辑非常复杂,或者需要进行大量的计算的地方,我们建议使用多线程来提高系统的性能。
面试需要掌握那些技能?
1. Java基础知识:包括面向对象编程、集合框架、多线程编程、JVM、测试和调试技术等。
2. 熟悉Spring框架:包括Spring MVC、Spring Boot、Spring Cloud等。
3. 掌握常见的数据库操作技术:如SQL语句、关系型数据库和非关系型数据库等。
4. 熟练使用版本控制工具:如Git等。
5. 对Web开发有一定的了解,熟悉前端相关技术:如HTML、CSS、JavaScript等。
6. 能够写高效的算法,并对数据结构有一定的了解。
7. 有良好的代码习惯,能够编写易于维护和扩展的代码,并理解单元测试和集成测试等概念。
8. 在面试过程中,还需要表达清晰、思路清晰明了、能够准确地回答面试官提出的问题,此外,自信、积极和礼貌也是很重要的。
2023年大厂面试官常问的技术核心知识点
1. Java基础知识:Java语言的基本知识,包括数据类型、继承、多态、接口等。
2. 面向对象编程:对面向对象编程原则和设计模式的理解,如单例、工厂、观察者、策略等。
3. 数据库知识:对关系型数据库和非关系型数据库操作的熟悉程度,掌握SQL语言,了解事务管理机制,并清楚地描述ORM框架的使用场景及实际操作。
4. Web开发:Web开发相关技术,例如Servlet、JSP、Spring MVC、JSON、RESTful API等。熟悉HTTP/HTTPS协议以及网络通信机制。
5. 常用框架:Spring、Hibernate、MyBatis等框架,尤其是Spring框架,深入理解Spring IOC,AOP等核心原理,知道如何配置基础设施组件,如事务管理、缓存等基础组件。
6. 分布式系统架构:分布式系统相关技术,如Dubbo、Zookeeper等,对微服务架构模式有一定的了解,熟悉分布式锁、分布式缓存、分布式数据存储等高可用性方案。
7. 性能排查:了解性能优化的方法,包括代码和SQL调优等,并且熟悉性能监测和分析工具,例如掌握JVM内存结构及堆栈排查技术。
8. 算法和数据结构:有基本的算法和数据结构知识,例如排序、查找、哈希表等。
我最近整理了一些小伙伴们发给我的面试题以及我的一些最新的面试等学习资料,有需要的小伙伴可以找我领取下。或者点击 → 《2023最新Java后端全套VIP面试学习资源》直接获取以下Java后端架构VIP进阶学习面试资料。
资料里面包含了:Java基础、MySQL、jvm、分布式、性能优化、spring 、spring boot、spring cloud、 MyBatis、Netty源码分析、算法、乙级高并发、Redis、dubbo、Tomcat、集合框架、锁、MQ、百万简历模板等等学习视频资料。
资料如图展示:(知识其中一部分)
同时也欢迎大家关注公众号【Java烂猪皮】,回复【666】,获取最新Java后端架构VIP学习资料以及视频学习教程,然后一起学习,一文在手,面试我有。
公众号【Java烂猪皮】里面每天都会分享很多独家的干货内容,比如:Java后端学习路线,分享实战项目,源码分析,百万级系统设计,系统上线的一些坑,MQ专题,真实面试题,每天都会回答大家提出的问题。
每一个专栏都是大家非常关心,和非常有价值的话题,我相信在专栏中你会学到很多东西,一起共勉。