本文为转载学习html
原文连接:http://tutorials.jenkov.com/java-concurrency/index.htmljava
译文连接:http://ifeve.com/java-concurrency-thread/多线程
在过去单CPU时代,单任务在一个时间点只能执行单一程序。以后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并非真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操做系统来完成多任务间对CPU的运行切换,以使得每一个任务都有机会得到必定的时间片运行。并发
随着多任务对软件开发者带来的新挑战,程序不在能假设独占全部的CPU时间、全部的内存和其余计算机资源。一个好的程序榜样是在其再也不使用这些资源时对其进行释放,以使得其余程序能有机会使用这些资源。分布式
再后来发展到多线程技术,使得在一个程序内部能拥有多个线程并行执行。一个线程的执行能够被认为是一个CPU在执行该程序。当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序。学习
多线程比多任务更加有挑战。多线程是在同一个程序内部并行执行,所以会对相同的内存空间进行并发读写操做。这多是在单线程程序中历来不会遇到的问题。其中的一些错误也未必会在单CPU机器上出现,由于两个线程历来不会获得真正的并行执行。然而,更现代的计算机伴随着多核CPU的出现,也就意味着不一样的线程能被不一样的CPU核获得真正意义的并行执行。spa
若是一个线程在读一个内存时,另外一个线程正向该内存进行写操做,那进行读操做的那个线程将得到什么结果呢?是写操做以前旧的值?仍是写操做成功以后的新值?或是一半新一半旧的值?或者,若是是两个线程同时写同一个内存,在操做完成后将会是什么结果呢?是第一个线程写入的值?仍是第二个线程写入的值?仍是两个线程写入的一个混合值?所以如没有合适的预防措施,任何结果都是可能的。并且这种行为的发生甚至不能预测,因此结果也是不肯定性的。操作系统
Java的多线程和并发性线程
Java是最早支持多线程的开发的语言之一,Java从一开始就支持了多线程能力,所以Java开发者能常遇到上面描述的问题场景。这也是我想为Java并发技术而写这篇系列的缘由。做为对本身的笔记,和对其余Java开发的追随者均可获益的。htm
该系列主要关注Java多线程,但有些在多线程中出现的问题会和多任务以及分布式系统中出现的存在相似,所以该系列会将多任务和分布式系统方面做为参考,因此叫法上称为“并发性”,而不是“多线程”。