在过去一台电脑只有单个CPU,而且在同一时间只能执行单个程序。后来出现的"多任务"意味着电脑在能够同时执行多个程序(AKA任务或者进程)。虽然那并非真正意义上的"同时"。多个程序之间共享仅有的一个CPU。操做系统会切换正在运行着的进程,在每次切换以前都会运行它们其中一个一小会儿。java
多任务模型的产生给软件开发者带来了新的挑战。程序再也不假设为能够一直占用CPU时间,也再也不占有全部的内存或者任何其余的计算机资源。做为操做系统中的一个"良好公民",程序应当释放全部那些它再也不使用的资源,这样其余的程序就可使用这些被释放的资源。算法
后来又出现了多线程模型,这意味着你能够在同一个进程中运行多个线程。线程的执行能够看做是CPU正在执行线程所在的程序。当你在同一个进程中运行了多个线程的时候,就像在同一个程序中有多个CPU正在运行同样。数据库
多线程能够极大地提升某些类型程序地性能。而后,多线程要比多任务复杂得多。在同一个进程中能够运行多个线程,所以这些线程能够同时读写相同内存块。这样会出现那些在单线程程序中不会出现地问题。并且其中某些问题并不会在单CPU机器中出现,由于在单CPU机器中两个线程历来就没有真正"同时"执行过。可是如今地计算机,大可能是多核CPU,甚至也多是多个CPU。这意味着不一样的线程能够同时在不一样的核或者CPU上同时执行。编程
若是一个线程在读一块内存区域的同时另外一个线程在想这块内存写入数据,那么第一个线程在执行完读操做以后拿到的是什么值呢?是旧的值?仍是第二个线程写入的新值呢?或者是两者混合以后的一个值?再或者,若是两个线程同时向同一个块内存区域写入数据,那么在它们的操做执行完以后,那块内存中的值是多少呢?是第一个线程写入的值?仍是第二个线程写入的值?或者是两个写入值的混合值?多线程
若是没有合适的预防措施那么上面任何一种结果都是可能的。这种行为甚至没法预测。出现的结果时时刻刻都不相同。所以一个开发人员必需要知道若是采起正确的预防措施 - 所以要学习若是控制线程对共享资源的访问,好比内存,文件,数据库等。这就是Java并发教程解决的问题之一。架构
Java中的多线程和并发
Java是第一个使开发人员很容易上手多线程的语言。Java在一开始就支持多线程。所以,Java开发者常常会遇到上面描述的问题。这就是我为何写这篇关于Java并发的教程。对于而言能够做为笔记,同时也可使Java开发同行从中获益。并发
本教程主要关注于Java中的多线程,可是其中有些问题在多线程中出现的问题也一样会在多任务和分布式系统中出现。这篇教程中一样也会出现多任务和分布式系统的参考。所以我用了"并发"这个词而不是"多线程"。框架
2015年的Java并发和之后的
自从第一批Java并发数据问世以后,关于并发架构和设计已经发生了不少的变化,即便是在Java 5中并发工具发布之后也是如此。异步
现在,又出现了相似Vert.x和Play/Akkay以及Qbit等异步"无共享"的平台和API。这些平台使用不一样于标准Java/JEE中的线程并发模型,共享内存和锁。还出版了新的非阻塞的并发算法,并且相似LMax Disrupter这种非阻塞工具也已经加入到了咱们的开发工具中。新的函数编程并行模式也随着Fork和Join框架引入到了Java 7中,以及Java 8中的集合流API。分布式
随着新特性的不断出现,也到了我该更新这个Java并发教程了。所以,本教程又会在更新中了。我会在合适的写新的教程并发布它们。