图:线程状态
图:线程状态
图:并行和并发
编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中存在更多容易出错的地方。那么,为何我们还要使用并发程序?线程是Java语言中不可或缺的重要功能,它们能使复杂的异步代码变得简单,从而极大地简化了复杂系统的开发。此外,想要充分发挥多处理器系统的强大计算能力,最简单的方式就是使用线程。随着处理器数量的持续增长,如何高效地使用蝙蝠正变得越来越重要。同时在当今互联网的时代,大量的互联网应用都面对着海量的访问请求,因此,并发编程在我们的应用中成为越来越不可或缺的一部分。
在早期的计算机中不包含操作系统,它们从头到尾只可以运行一个程序,操作系统的出现使得计算机每次能运行多个程序,并且不同的程序都在单独的进程中运行,之所以在计算机中加入操作系统来实现多个程序的同时执行,主要是基于下面几个原因:
资源利用率
在某些情况下,程序必须等待某个外部操作执行完成,而等待时程序无法执行其他任何工作.
因此,如果在等待同时可以运行另一个程序,那么无疑将提高资源的利用率.
公平性
不同的用户和程序对于计算机上的资源有着同等的使用权.一种高效的运行方式是通过时间分片
使用户和程序可以共享计算机资源,而不是一个程序从头运行到底,再启动下一个程序.
便利性
通常来说,在计算多个任务时,应该编写多个程序,每个程序执行一个任务并在必要时相互通信,
这比只编写一个程序来计算所有任务更容易实现.
线程优势:
如果使用得当,线程可以有效降低程序的开发和维护成本,同时提升复杂应用程序的性能.在服务器
应用程序中,可以提升资源利用率以及系统吞吐率,线程还可以简化JVM的实现,垃圾收集器通常在
一个或多个专门的线程中运行,在许多重要的Java应用中,都在一定程度上用到了线程.
发挥多处理器的强大能力
随着现在多处理器的普及,我们的服务器目前多数都是多个核心的,由于CPU的基本调度单位是线程,
因此如果在程序中只有一个线程,那么最多同时只能在一个处理器上运行.在双处理器系统上,
单线程的程序只能使用一半的CPU资源,而在拥有100个处理器的系统上,将有99%的资源无法使用.
另一方面,多线程程序可同时在多个处理器上执行.如果设计正确,多线程程序可以通过提高处理器
资源的利用率来提升系统吞吐率.
异步事件的简化处理
服务器应用程序在接受来自多个远程客户端的连接请求时,如果为每个连接都分配各自的线程并且
使用同步I/O,那么就会降低这类程序的开发难度.
在单线程应用中,如果在处理某一请求过程中出现阻塞,意味着在这个线程被阻塞的期间,对所有请求
的处理都将停顿.为了避免这个问题,单线程服务器应用程序必须使用非阻塞I/O,这种I/O的复杂性要
远远高于同步I/O,并且很容易出错,如果每个请求都拥有自己的处理线程,那么在处理某个请求时发生的
阻塞将不会影响其他请求的处理.
目前主流Web容易,如Tomcat,是支持多线程异步非阻塞模型来响应请求的,这样可以获得更大的请求吞吐量.
线程带来的风险
Java对线程的支持其实是一把双刃剑.虽然Java提供了相应的语言和库,以及一种明确的跨平台内存模型,
这些工具简化了并发应用程序的开发,但同时也提高了对开发人员的技术要求,因为在更多的程序中会使用线程.
线程安全问题
线程安全性可能是非常复杂的,在没有充分同步的情况下,多个线程中的操作执行顺序是不可预测的,
甚至可能会出现奇怪的结果
活跃性问题
多线程会导致一些在单线程程序中不会出现的问题,例如活跃性问题.当某个操作无法继续执行下去时,
就会发生活跃性问题.在串行程序中,活跃性问题的形式之一就是无意中造成的无限循环,从而使循环之后
的代码无法得到执行.还有一些其他类型的问题,例如"如果线程A在等待线程B释放其持有的资源,而线程B永远都不释放该资源
,那么A就会永远的等待下去.这就是通常所说的"死锁"".
原文:https://www.cnblogs.com/ukzq/p/12877500.html