Thread 1
图:线程状态
图:线程状态
图:并行和并发
编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中存在更多容易出错的地方。那么,为何我们还要使用并发程序?线程是Java语言中不可或缺的重要功能,它们能使复杂的异步代码变得简单,从而极大地简化了复杂系统的开发。此外,想要充分发挥多处理器系统的强大计算能力,最简单的方式就是使用线程。随着处理器数量的持续增长,如何高效地使用蝙蝠正变得越来越重要。同时在当今互联网的时代,大量的互联网应用都面对着海量的访问请求,因此,并发编程在我们的应用中成为越来越不可或缺的一部分。
在早期的计算机中不包含操作系统,它们从头到尾只可以运行一个程序,操作系统的出现使得计算机每次能运行多个程序,并且不同的程序都在单独的进程中运行,之所以在计算机中加入操作系统来实现多个程序的同时执行,主要是基于下面几个原因:
资源利用率
在某些情况下,程序必须等待某个外部操作执行完成,而等待时程序无法执行其他任何工作.
因此,如果在等待同时可以运行另一个程序,那么无疑将提高资源的利用率.
公平性
不同的用户和程序对于计算机上的资源有着同等的使用权.一种高效的运行方式是通过时间分片
使用户和程序可以共享计算机资源,而不是一个程序从头运行到底,再启动下一个程序.
便利性
通常来说,在计算多个任务时,应该编写多个程序,每个程序执行一个任务并在必要时相互通信,
这比只编写一个程序来计算所有任务更容易实现.
线程优势:
如果使用得当,线程可以有效降低程序的开发和维护成本,同时提升复杂应用程序的性能.在服务器
应用程序中,可以提升资源利用率以及系统吞吐率,线程还可以简化JVM的实现,垃圾收集器通常在
一个或多个专门的线程中运行,在许多重要的Java应用中,都在一定程度上用到了线程.
发挥多处理器的强大能力
随着现在多处理器的普及,我们的服务器目前多数都是多个核心的,由于CPU的基本调度单位是线程,
因此如果在程序中只有一个线程,那么最多同时只能在一个处理器上运行.在双处理器系统上,
单线程的程序只能使用一半的CPU资源,而在拥有100个处理器的系统上,将有99%的资源无法使用.
另一方面,多线程程序可同时在多个处理器上执行.如果设计正确,多线程程序可以通过提高处理器
资源的利用率来提升系统吞吐率.
异步事件的简化处理
服务器应用程序在接受来自多个远程客户端的连接请求时,如果为每个连接都分配各自的线程并且
使用同步I/O,那么就会降低这类程序的开发难度.
在单线程应用中,如果在处理某一请求过程中出现阻塞,意味着在这个线程被阻塞的期间,对所有请求
的处理都将停顿.为了避免这个问题,单线程服务器应用程序必须使用非阻塞I/O,这种I/O的复杂性要
远远高于同步I/O,并且很容易出错,如果每个请求都拥有自己的处理线程,那么在处理某个请求时发生的
阻塞将不会影响其他请求的处理.
目前主流Web容易,如Tomcat,是支持多线程异步非阻塞模型来响应请求的,这样可以获得更大的请求吞吐量.
线程带来的风险
Java对线程的支持其实是一把双刃剑.虽然Java提供了相应的语言和库,以及一种明确的跨平台内存模型,
这些工具简化了并发应用程序的开发,但同时也提高了对开发人员的技术要求,因为在更多的程序中会使用线程.
线程安全问题
线程安全性可能是非常复杂的,在没有充分同步的情况下,多个线程中的操作执行顺序是不可预测的,
甚至可能会出现奇怪的结果
活跃性问题
多线程会导致一些在单线程程序中不会出现的问题,例如活跃性问题.当某个操作无法继续执行下去时,
就会发生活跃性问题.在串行程序中,活跃性问题的形式之一就是无意中造成的无限循环,从而使循环之后
的代码无法得到执行.还有一些其他类型的问题,例如"如果线程A在等待线程B释放其持有的资源,而线程B永远都不释放该资源
,那么A就会永远的等待下去.这就是通常所说的"死锁"".
作者:ukyo--碳水化合物
出处:https://www.cnblogs.com/ukzq/p/12877500.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!