7天八股速记之Java后端——Day 2

2024-04-06 00:28
文章标签 java day 八股 速记

本文主要是介绍7天八股速记之Java后端——Day 2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

线程和进程的区别

进程线程
定义操作系统进行资源分配和调度的基本单位操作系统能够进行运算调度的最小单位
从属关系运行程序的实例进程的一个执行流
资源共享进程间不能共享资源线程间可以共享资源
上下文切换切换速度慢切换速度快
操纵方操作系统编程人员

线程和协程的区别?什么场景下用到协程?

线程和协程是并发编程中两种不同的机制,它们有一些区别:

调度方式:线程由操作系统内核进行调度,它们是操作系统的原生概念,执行的调度和切换由操作系统决定。而协程是在用户空间进行调度,程序员可以显式地控制协程的切换,而不需要依赖操作系统的调度。

并发性:线程是并发执行的,一个程序可以同时有多个线程在运行,每个线程都有自己的执行流。协程通常是单线程的,一个协程执行时可以暂停,切换到另一个协程执行,这样实现了并发。

资源消耗:线程需要较多的资源,如栈空间和线程上下文切换的开销较大。而协程通常只需要较小的栈空间,并且切换开销较低,因为协程的切换是由程序员控制的,不需要切换到操作系统内核态。

阻塞和同步:在传统的线程模型中,当一个线程遇到阻塞操作(如IO操作)时,会被操作系统调度到等待状态,从而允许其他线程运行。而协程可以通过显式的挂起和恢复操作来实现非阻塞的同步,避免了线程切换和阻塞等待。

在一些特定的场景下,协程可以提供更高效的并发编程解决方案:

高并发IO密集型应用:当应用程序需要同时处理大量IO操作(如网络请求、数据库查询等)时,使用协程可以避免线程切换的开销,提高并发处理能力。

异步编程:协程可以使异步代码的编写更加简洁和可读。通过使用协程库或语言提供的异步/await等关键字,可以编写顺序化、可读性高的异步代码,而无需显式地处理回调函数和线程切换。

有限状态机:协程可以用于实现有限状态机(FSM)的编程模型。通过使用协程来表示状态和状态转换,可以简化复杂的状态逻辑和事件处理。

需要注意的是,协程并非在所有情况下都是最佳选择。在某些情况下,如CPU密集型任务或需要与底层系统紧密交互的情况下,线程模型可能更为适合。在选择使用协程时,需要根据具体的应用场景和需求进行评估和权衡。

怎么理解容器的线程安全与线程不安全?里面具体做了什么样的实现?

  • 线程安全
    在拥有共享数据的多条线程并行执行的程序中,代码可以通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据错误等意外情况,称为线程安全。
  • 线程不安全:不提供机制保护,出现多个线程先后更改数据造成得到脏数据的可能。
    不提供机制保护,出现多个线程先后更改数据造成得到脏数据的可能。
  • 线程安全里面具体做了什么样的实现
    1.互斥同步
    通过 synchronized 关键字编译后,在同步块的前后生产 monitorenter 和 monitorexit 两个字节码指令,需要明确的 reference 对象进行解锁。获取 reference 对象后当前线程可以操作代码块,当锁的持有数归 0 锁释放后,可以在被其他线程获取。
    2.非阻塞同步
    对互斥同步的优化,对于获取锁失败的线程,将不再让其挂起,而是自旋等待一段时间,若还剩无法获取锁才将其挂起。

Java 如何实现线程安全

1.使用 Atomic 类,通过 CAS 保证操作不会在执行过程中被中断。

2.使用 synchronized、volatile 进行加锁。
需要对集合容器内部的方法进行加锁,以 map 为例,由于 hashMap 内部没有锁,所以它会导致线程不安全。而如果我们使用 hashTable,由于其中使用 synchronized 关键字进行了加锁,就可以保证线程安全。

3.使用 TLS 避免资源竞争,提供线程的副本进行同时访问和维护。

并发类库提供的线程池实现有哪些?

  1. newCachedThreadPool()
  2. newFixedThreadPool(int nThreads)
  3. newSingleThreadExecutor()
  4. newSingleThreadScheduledExecutor() 和newScheduledThreadPool(int corePoolSize)
  5. newWorkStealingPool(intparallelism)

线程池中的几个参数,比如核心线程数、最大线程数,如果让你定,你会怎么样去设定这些值?基于什么样

一般多线程执行的任务类型可以分为 CPU 密集型和 I/O 密集型,根据不同的任务类型,我们计算线程数的方法也不一样。
假设 N 为 CPU 核心数,WT 为线程等待时间,ST 为线程时间运行时间

  • CPU 密集型任务:主要消耗 CPU 资源,可以额外设置一个线程,一旦任务暂停,CPU 就会处于空闲状态,额外的线程可以充分利用 CPU的空闲时间,线程数为 N+1
  • I/O 密集型任务: I/O 交互的处理消耗较大,而线程在处理 I/O 的适合不会占用 CPU 来处理,因此在可以多配置一些线程,线程数2N。
  • 在一般的业务应用场景中,我们可以用下列公式计算线程数: 线程数 = N * (1 + WT / ST)

我们可以根据实际业务场景,从 “N+1” 和 “2N” 中选出一个适合的,计算出一个大概的线程数,之后通过实际压测进行增大或减小线程数调整,然后观察具体的运行时间变化,最终确定一个具体的线程数。

这篇关于7天八股速记之Java后端——Day 2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/878548

相关文章

SpringBoot整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程