16.线程阻塞原因
16.1 题目
线程阻塞的原因可能有哪些?至少说出2种
16.2 深入解析
线程阻塞是指线程进入等待状态,无法继续执行,只有等到满足某些条件才能被重新调度。
造成线程阻塞的常见原因有:
- 线程执行I/O(输入/输出)操作时:比如文件读写、网络通信、数据库查询时
- 互斥锁阻塞:当多个线程访问共享数据时,如果互斥锁被另一个线程占用,其它线程会进入阻塞状态
- 死锁阻塞
- 线程休眠
- 高优先级线程长期占用CPU,导致低优先级线程无法获得执行机会
等。
16.3 答题示例
线程阻塞通常是因为它在等待某些资源或事件才能继续执行,常见原因包括:
- I/O 操作:如文件读写、网络请求或数据库访问时,线程会被挂起直到操作完成;
- 同步原语:调用
lock/Monitor.Enter、Mutex、Semaphore等时,如果资源被其他线程占用,就会阻塞;
此外,死锁(多个线程互相等待对方的锁)和显式调用Thread.Sleep也会导致线程阻塞。
16.4 关键词联想
- I/O 阻塞
- 同步锁(
lock/Monitor/Mutex) - 信号量(
Semaphore/SemaphoreSlim) - 等待句柄(
WaitHandle/AutoResetEvent/ManualResetEvent) - 死锁(Deadlock)
- 线程休眠(
Thread.Sleep) - 优先级反转
- 非阻塞与异步
- 抢占式调度 vs 协作式调度
- 上下文切换开销
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com