Java并发和多线程介绍
在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。
随着多任务是为软件开发人员的新挑战。程序可以不再承担所有的CPU时间,也不是所有的记忆或任何其他计算机资源。一个好的程序应该释放所有资源就不再使用,以便其他程序可以使用它们
后来出现了多线程,这意味着你可以有多个线程在同一程序的执行。一个执行线程可以被看作一个CPU执行程序。当你有多个线程执行相同的程序,它是具有多个CPU执行同一程序。
多线程比多任务更加有挑战。多线程是在同一个程序内部并行执行,因此会对相同的内存空间进行并发读写操作。这可能是在单线程程序中从来不会遇到的问题。其中的一些错误也未必会在单CPU机器上出现,因为两个线程从来不会得到真正的并行执行。然而,更现代的计算机伴随着多核CPU的出现,也就意味着不同的线程能被不同的CPU核得到真正意义的并行执行
如果一个线程读取一个存储器位置,而另一个线程写入什么值,第一个线程结束阅读?旧的价值?价值的第二线程写?或价值,是两者的组合?或者,如果两个线程写入到相同的内存位置的同时,什么样的价值将离开的时候,他们做了什么?价值的第一个线程写的吗?价值的第二线程写?或混合两值写的吗?
如果没有适当的预防措施,任何结果都是可能的,甚至不可预测的。结果可能会随时间而变化。因此,重要的是作为一个开发人员知道如何采取正确的预防措施就是学习如何控制线程访问共享资源,如内存,文件,数据库等,是一本Java并发主题教程地址。
Java多线程与并发
Java是最先支持多线程的开发的语言之一,Java从一开始就支持了多线程能力,因此Java开发者能常遇到上面描述的问题场景。这也是我想为Java并发技术而写这篇系列的原因。作为对自己的笔记,和对其他Java开发的追随者都可获益的。
该系列主要关注Java多线程,但有些在多线程中出现的问题会和多任务以及分布式系统中出现的存在类似,因此该系列会将多任务和分布式系统方面作为参考,所以叫法上称为“并发性”,而不是“多线程”。
2015 Java并发和转发
在世界流行的第一本关于并发架构和设计的书是由于Java5并发工具的发布而引起的
新的异步“无共享”平台和API,例如:Vert.x和Paly/Akka和Qbit的出现,这些平台的使用比标准的Java / JEE的并发模型的线程不同的并发模型,共享内存和锁定。新的非阻塞并发算法已经公布,新的非阻塞的工具如LMAX破坏者已经被添加到我们的工具包。新功能的编程并行了fork和join框架在Java 7和Java 8 集合流API。