Java并发/多线程指引

jimmy 2018年08月17日 1,220次浏览

Java并发/多线程指引

在古老的时代一个计算机只有一个CPU,在一个时间只能执行一个程序。后来出现了多任务让计算机在同一个时间能执行多个任务。但是这个同一个时间不是真正的同一时刻。多个程序共享单一的CPU。操作系统在运行的程序中切换,在切换之前不停的运行程序一小会。这样用户看着像自己的多个程序都在运行中。

伴随着多任务给软件开发者带来了新的挑战。程序不再拥有所有的CPU时间,不再拥有所有的内存以及其他的计算机资源。一个好的程序当不在需要资源的时候应该释放掉,以便于其他程序能够使用。

后来出现了多线程,意味着可以在一个程序中拥有多个执行的线程。一个线程的执行可以被认为一个CPU执行程序。当有多个线程执行同一个程序,就好像多个CPU运行了同一个程序。

多线程对增加相关程序的性能是一个非常好的方式。但是多线程编程比多进程更有挑战。由于这些线程在同一个进程中运行,因此能够同时读取和写入同一块内存,这对导致单进程中不会出现的错误。这不会出现在单CPU机器上,因为两个线程不会真正的同时执行。现代的计算机有多个CPU核心,甚至拥有多个CPU,这意味着其他的线程可以被其他的CPU同时执行。

请输入图片描述

如果一个线程A读一块内存的时候另外一个线程B在写同一块内存,当第一个下那次结束读后这块内存的内容是什么?最开始的值?第二个线程B写入的值?或者说是两个线程写入混合的值?

当没有恰当的预防措施时,任何一个结果都是有可能的。行为是不可预测的。结果每次也可能不同。因此对一个开发人员来说采用恰当的预防措施是非常必要的。意味着开发人员需要知道如何控制线程读取空闲的资源,比如内存,文件,数据库等等。

Java中的多线程和并发

java是第一个让多线程编程对开发人员容易使用的语言。java从一开始就有了多线程能力。因此java开发者经常面对上面的问题。

这里主要关心java多线程方面,但是多线程编程遇到的问题和多进程或者分布式系统遇到的问题是类似的。

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