jenkov - 1.Java并发与多线程教程

什么是多线程

多线程的意思是在一个程序里有多个线程执行。一个线程就像一个独立的CPU在执行你的程序。所以,多线程程序就像是有多个CPU在同一时间执行不同部分代码的程序。


但是一个线程不是一个CPU。通常一个单独的CPU会在多线程之间共享它的执行时间,在线程执行了一定时间后进行切换。多线程也可能被不同的CPU执行。


为什么要用多线程

使用多线程的原因有很多。最通常的原因有:

  • 更好利用单个CPU
  • 更好利用多个CPU或CPU核
  • 在响应方面,有更好的用户体验
  • 在公平方面,有更好的用户体验

更好利用单个CPU

一个最普遍的原因是为了能够更好的利用计算机资源。例如,如果一个线程正在等待网络上的一个请求,那么另一个线程能够在此时利用CPU去做其它的事情。另外,如果计算机有多个CPU,或者CPU上有多个执行核心,那么多线程能够帮忙你的程序利用这些额外的CPU核。

更好利用多个CPU或CPU核

如果计算机有多个CPU,或者CPU上有多个执行核心,那么你需要在你的程序中使用多线程去利用所有的CPU或CPU核心。一个的线程最多利用一个CPU,就像上面提到那样,有时还不能完成利用一个CPU。

在响应方面,有更好的用户体验

另一个使用多线程的原因是为了提供更好的用户体验。例如,如果你在一个界面上点击了一个按钮,发起了一个网络上的请求,那么由哪个线程来执行这个请求很重要。如果你用更新界面的那个线程,那些在等待响应期间,用户可能会感觉到界面卡了。相反,这个请求可以被后台一个线程执行,那么更新界面的线程就能够继续响应用户的其他请求。

在公平方面,有更好的用户体验

第4原因是在用户之前更公平的共享资源。想像有一台服务器,它接受从客户端来的请求,并且只有一个线程去执行这些请求。如果一个客户端发送了一个需要处理很长时间的请求,那么所以其他客户端的请求将不得不等待那个请求完成。如果让每个客户端的请求在它们自己的线程中执行,那么就没有一个任务能够完全独占CPU。

多线程与多任务对比

在过去,计算机只有一个CPU并且一次只能执行一个程序。大部分小型机不够强大去同时执行多个程序,所以并没有尝试。公平的说,许多大型机系统在同时执行多个程序的方面比个人电脑要多许多年。

多任务

之后多任务的出现,说明计算机能够同时执行多个程序(也就是任务或进程)。但它并不是真正的“同时”。CPU被多个程序共享。操作系统会控制每个任务在执行一小段时间后进行切换。

多任务给软件开发者带来了新挑战。程序员不再假定能够获取所有的CPU时间,或所有内存或所有其他资源。一个“好市民”的程序,在不需要使用时释放所有资源,以便其它程序能够使用。

多线程

后来多线程出现,意味着在一个程序里能够使用多个线程执行。一个线程执行可以想像成一个CPU在执行程序。当你使用多线程时,就像有多个CPU执行同个程序。

多线程是困难的

多线程能够非常有效提高某此程序的性能。然而,多线程比多任务更有挑战性。多个线程在同个程序中执行,所以会同时读取与写入内存。这会导致一些单线程程序里没有的错误。这些错误在单CPU的机器可能不会出现,因为两个线程不可能同时执行。然而,现代计算机有多个CPU核心,甚至也有多个CPU。这意味着不同线程能够同时地被不同的CPU执行。


如果一个线程读取的内存位置,有另一个线程在写入,那么第一个线程会读取到什么值?旧值?还是第二个线程写入的值?或者是两者间的混合值?又如果,两个线程同时写入相同的内存位置,最后会是什么值?第一个线程写入的值?第二个线程写入的值?又或者各写一半的值?

没有适当的预防措施,以上的结果都有可能。上述行为并不能被预知。结果每次都会不同。所以开发者懂得采取正确的预防措施是很重要的:意思是学习如何控制线程访问共享资源,如内存、文件和数据库等。

并发模型

Java并发模型最初假设多个线程在相同的程序中执行并且共享对象。这种模型被称为“共享状态的并发模型”。许多并发语言结构和工具都是设计成支持这种并发模型的。

然而,时至今日,并发架构和设计已经发生了变化。

共享状态的并发模型引起许多很难解决的并发问题。所以,一个可选的、被称为“不共享”或“独立状态”的并发模型正在流行起来。在独立状态的并发模型中,线程不共享任何对象和数据。这避免了很多共享状态并发模型的并发访问问题。

全新且异步的“独立状态”平台和工具,如Netty、Vert.x 和 Play / Akka 和 Qbit,涌现了。全新的非阻塞并发算法被发布,并且全新的非阻塞工具如LMax Disrupter已经加入到我们的工具当中。
还有Java 7的Fork / Join 框架、Java 8的集合流API。

引用

  • http://tutorials.jenkov.com/java-concurrency/index.html

你可能感兴趣的:(jenkov - 1.Java并发与多线程教程)