ASP.NET Core面试题之异步处理、多线程、锁

🎉来一波C#.NET面试中,异步、多线程、锁方面的高频问题🎉

🥳希望你别再被面试官追着“砍”了🎉

🥳祝你一面而就🎉

1. 什么是进程?

进程是系统中正在运行的一个程序,程序一旦运行就是进程。进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。
一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。

2.什么是线程?

线程(Thread)是进程中的基本执行单元,是操作系统分配CPU时间的基本单位。

一个进程至少有一个主线程,可以包含若干个线程。在进程入口执行的第一个线程被视为这个进程的主线程。在.NET应用程序中,都是以Main()方法作为入口的,当调用此方法时系统就会自动创建一个主线程。

进程和线程的根本区别?
进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

3.什么是多线程?

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
多线程的好处?
可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。

4.C#中怎么开启多线程?

Thread类是C#语言对计算机的线程对象的一个封装,对Thread进行操作,并不是直接对计算机中的线程进行操作,用Thread开启线程,net framework需要去计算机申请线程,对Thread进行暂停或者停止操作,.net framework也只是给操作系统发一个信号,它并不能真正的控制操作系统的底层线程。

5.C#中的TheadPool类是什么?

ThreadPool类又是对Thread的一个封装,它提供了一个线程池,对C#中的Thread进行一个管理。
其目的是为了减少开启新线程消耗的资源(使用线程池中的空闲线程,不必开启新的线程),以及统一管理线程(线程池中的线程在执行完毕后回归到线程池中,等待新的任务分配)。

6.C#中的Task类是什么?

Task(任务)是基于Thread的,是比较高层级的封装,Task最终还是需要Thread来执行。Task比Thread的开销小,Task默认使用线程池。

7.同步与异步的区别?

同步意味着 客户端提出了一个请求以后,在回应之前只能等待。异步意味着 客户端提出一个请求以后,还可以继续提其他请求。
同步和异步的消息通信机制的理解
所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。
而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调*发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。

8.什么是线程安全?

在C#中,线程安全是一个非常重要的概念。线程安全是指在使用多线程编程时,程序能够正确地处理共享数据而不会产生数据冲突或竞争条件,从而保证程序运行的正确性和稳定性。

9.常见的线程安全问题有哪些?

  • 竞争条件(Race Condition):当多个线程并发访问共享资源时,可能会导致竞争条件。例如,当多个线程通过递增操作改变一个共享变量的值时,可能会导致值的不确定性。

  • 死锁(Deadlock):当多个线程相互等待彼此释放某些资源时,可能会导致死锁。在死锁状态下,程序停止响应,无法正常运行。

  • 内存泄漏(Memory Leak):内存泄漏是指程序运行时不断分配内存,但不及时释放,导致内存使用过多。这可能会影响程序的性能和可靠性。

  • 线程干扰(Thread Interference):线程干扰是指在线程间共享数据时,未正确同步数据所导致的问题。这可能导致数据丢失或不一致的情况。

10.解决线程安全问题的常用方法?

  • ①互斥锁
  • ②原子操作
  • ③并发集合:并发集合是一种特殊的集合类型,它是线程安全的。在C#中,ConcurrentQueue(Queue)、ConcurrentDictionary(Dictionary)、ConcurrentStack(Stack)、ConcurrentBag(List)等类就是并发集合。
  • ④使用线程安全的类型:例如,StringBuilder、DateTime和String等类型都是线程安全的

11.锁的作用

在多线程环境下,当多个线程同时访问同一个共享资源时,容易出现数据竞争的问题,导致程序出现不可预期的错误。因此,在多线程高并发场景下,锁能够保护共享资源,确保多个线程访问资源时不会产生冲突。

12.C#中的 lock 关键字有何作用?

lock关键字实现 互斥锁,是确保线程安全的一种方式。lock实质是调用 Monitor.Enter 和Monitor.Exit两个方法的简化语法。
通常情况下,可以通过 lock一个私有的引用成员变量来完成成员方法内的线程同步,而通过lock一个私有的静态引用成员变量来完成静态方法内的线程同步。

13.C#中的读写锁有何作用?

读写锁(ReaderWriterLock)使用该锁,可以大大提高数据并发访问的性能,只有在写时,才会阻塞所有的读锁。
实现效果:读读不互斥,读写,写写互斥

14.SQL Server中的锁有哪些?

一般分类:共享锁、排它锁、更新锁;
锁的粒度:行锁、页锁、表锁;
思想:悲观锁、乐观锁;

SQL方面的面试题请参考:数据库与SQL高频面试题

15.什么是阻塞与非阻塞?

阻塞非阻塞 指的是服务器端,而同步异步指的是客户端。
阻塞意味着 服务器接受一个请求后,在返回结果以前不能接受其他请求。
非阻塞意味着 服务器接受一个请求后,尽管没有返回结果,还是可以继续接受其他请求。

16.什么是线程死锁?怎么避免线程死锁?

多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

如何避免线程死锁?

  • 加锁顺序(线程按照一定的顺序加锁)
  • 加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
  • 死锁检测

17.C#中异步和多线程的区别?

异步是目的,而多线程是实现这个目的的方法。
异步有的时候会用到线程,但有的时候用系统的异步调用功能。有一些IO操作也是异步的,但是未必需要一个线程来运行。
异步操作的适用范围?你什么时候用异步? 异步操作 可以提高程序的响应能力
当需要执行I/O操作时,使用异步操作更合适;比如:数据库操作、文件操作、网络的读写、WebApi等跨进程调用。
多线程的适用范围? 那种需要长时间CPU运算的场合,比如耗时较长的图形处理和算法执行

18.什么是async/await

async/await提供了一种简单且易于理解的方式来编写异步操作。这俩关键字是C#5.0 引入的关键字,本质上是通过编译器实现的语法糖。

19.消息队列有什么作用?

四个作用:

  • 异步处理
  • 应用解耦
  • 流量削峰
  • 消息通讯

20.项目中用什么做消息队列?

  1. C#内置队列Queue<>,线程安全队列ConcurrentQueue<>
  2. Redis的List类型可以用作简易队列
  3. RabbitMQ、RocketMQ、Kafka等队列中间件(企业级常用)

(未完待续)

今天先分享这么多,免费优质.NET技术资源,尽在【物联网大联盟】欢迎大家关注+评论+转发。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 什么是ASP.NET CoreASP.NET Core是一个跨平台的开源Web应用程序框架,它可以在Windows、Linux和macOS等操作系统上运行。它是.NET Core的一部分,可以使用C#、F#和Visual Basic等语言进行开发。 2. ASP.NET CoreASP.NET有什么区别? ASP.NET Core是一个轻量级的框架,它比ASP.NET更加灵活和可扩展。它可以在不同的操作系统上运行,而ASP.NET只能在Windows上运行。ASP.NET Core还提供了更好的性能和安全性,以及更好的支持Docker和云计算等新技术。 3. 什么是中间件? 中间件是ASP.NET Core应用程序中的一个组件,它可以处理HTTP请求和响应。中间件可以是一个单独的函数或一个类,它可以在请求到达应用程序之前或之后执行一些操作,例如记录日志、验证身份、压缩响应等。 4. 什么是依赖注入? 依赖注入是一种设计模式,它可以帮助我们解耦应用程序中的组件。在ASP.NET Core中,我们可以使用依赖注入来管理应用程序中的服务和组件。依赖注入可以使代码更加可测试、可维护和可扩展。 5. 什么是Razor视图引擎? Razor视图引擎是ASP.NET Core中的一个组件,它可以帮助我们创建动态的HTML页面。Razor视图引擎使用C#或VB.NET等语言来编写视图代码,它还提供了一些特殊的语法和标记,例如@符号、@model指令、@if语句等。 6. 什么是MVC模式? MVC模式是一种软件架构模式,它将应用程序分为三个部分:模型、视图和控制器。模型表示应用程序的数据和业务逻辑,视图表示应用程序的用户界面,控制器负责处理用户请求并更新模型和视图。 7. 什么是Web API? Web API是一种用于创建RESTful Web服务的框架。在ASP.NET Core中,我们可以使用Web API来创建基于HTTP协议的API,它可以返回JSON、XML等格式的数据。Web API还提供了一些特殊的特性,例如路由、过滤器、模型绑定等。 8. 什么是SignalR? SignalR是ASP.NET Core中的一个组件,它可以帮助我们创建实时Web应用程序。SignalR使用WebSocket协议或其他技术来实现双向通信,它可以在服务器和客户端之间传输数据和消息。 9. 什么是Identity框架? Identity框架是ASP.NET Core中的一个组件,它可以帮助我们管理应用程序中的用户和身份验证。Identity框架提供了一些特殊的类和方法,例如UserManager、SignInManager、IdentityRole等,它还可以与ASP.NET Core中的其他组件集成,例如中间件、授权等。 10. 什么是EF Core? EF CoreASP.NET Core中的一个组件,它可以帮助我们管理应用程序中的数据访问。EF Core是Entity Framework的轻量级版本,它可以在不同的数据库上运行,例如SQL Server、MySQL、PostgreSQL等。EF Core提供了一些特殊的类和方法,例如DbContext、DbSet、LINQ查询等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

采石之人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值