您的位置:首页 > 编程语言 > Java开发

Java并发编程(Java Concurrency)(1)- Java并发编程简介

2016-08-23 21:28 337 查看
原文链接:http://tutorials.jenkov.com/java-concurrency/index.html

  摘要:这是翻译自一个大概30个小节的关于Java并发编程的入门级教程,原作者Jakob Jenkov,译者Zhenning Lang,转载请注明出处,thanks and have a good time here~~~(希望自己不要留坑)

第一节 Java并发编程简介

最初的计算机仅有一个CPU,并且在同一个时间段内也只能执行一个程序。随后出现了多任务(multitasking),这意味着计算机可以在同一个时间段内执行多个程序(即多个任务tasks或是进程processes)。尽管这并不是真正的“在同一个时间段内”。不同的程序共享单个CPU,在这些同时运行的程序运行的过程中,操作系统负责在不同的程序间切换CPU的使用,即每个程序运行“一小会”。

多任务的出现给程序员们带来了新的挑战。程序可以独享CPU这条假设不再成立,同时内存和其他计算机的资源也无法再保证被单个程序独享。所以作为一个“好公民”(good citizen)的程序,在其不需要资源(CPU、内存等)时将释放资源,好让其他的程序可以使用这些资源。

随后多线程(multithread)出现了,这意味着在单个程序中存在着同时被执行的多个线程。当一个线程被执行时,可以看成是一个CPU在执行这个程序,所以这意味着:当一个程序执行多线程时,可以看成是多个CPU在执行这个程序

对已一些类型的程序来说,多线程技术可以极大的提升其性能,然而就编程来说“多线程”比“多任务”更加具备挑战性。同一个程序执行了多个线程,这导致这些线程也必然会存在同时读写相同内存的可能性,这将导致许多在单线程程序中不会存在的错误。这其中的一些错误在单CPU的机器上不会发生,因为多个线程并没有真正的“同时”被执行。然而现在大多是的机器都是多CPU的,这意味着不同的线程将真正的被不同的CPU同时执行。



如果一个线程读一块内存的同时另一个线程写这个线程,那么第一个读线程将读到什么数据?是写之前的旧值?还是写线程写的新值?还是新旧值的某种运算结果?另一种情况,当两个线程同时写一块内存,写过之后这块内存将是什么值?是每个线程单独的写入的值还是二者的混合?

如果不合理预防,以上几种情况都可能发生,即程序的行为将无法被预测,程序的运行结果每次运行都将不一样。因此作为程序员必须知道如何对这些问题做出合理的预防措施 - 这意味着要学会如何控制线程对于内存、文件、数据库等资源的使用权限,这也是这篇Java并发编程教程将要讨论的话题之一。

Java中的多线程和并发

Java是第一批使程序员轻松开发多线程成的编程语言之一,从最开始Java就具有开发多线程程序的能力,这也导致了Java程序员面临着上述的这些关于多线程编程的问题。这也是我为什么写这一系列关于Java并发编程教程的原因:既是我个人的一个学习笔记,也希望众多Java程序员可以从中获益。

这个系列教程将首先讨论Java中的多线程编程,但多线程中遇到的一些问题,也与多任务或者分布式系统中所遇到的一些问题很相似,所以本教程也将涉猎这些话题。因此本教程的题目用了涵盖能力更广的“并发”(concurrency)而非“多线程”(multithread)。

2015年的Java并发以及今后1

自从第一本关于Java并发编程的书籍问世以及Java 5 concurrency utilities的发布,并发编程框架的世界发生了许许多多的变化。

新的“无共享异步平台”(asynchronous “shared-nothing” platforms)以及例如Vert.x、Play / Akka、Qbit这些API已经出现。这些平台利用了不同于标准Java / JEE的并发模型,涉及到内存共享以及锁。新的非阻塞并发算法也已经发布,新的如LMax Disrupter的非阻塞工具也被加入我们的工具包(toolkits)中。Java 7引人了新的函数并行编程框架:Fork and Join框架,Java 8引入了collection流(collection streams API)。

所以随着这些新发展的问世,我也即将更新这个系列教程。因此,这个教程即将被再次完善。只要时间充足我将发表更新的教程。

译者注:原文时间为2014年
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐