JAVA并发和多线程教程之首页

本文翻译自http://tutorials.jenkov.com/java-concurrency/index.html,机翻加人工校正,仅供学习交流。

JAVA并发和多线程教程

Java并发是一个在Java平台上涵盖了多线程、并发性和并行性的术语,包括了java的并发工具、问题和解决方法。本篇教程包括Java中的多线程核心概念、并发构造、以及并发所带来的问题、消耗和优点。

java并发教程视频

https://www.youtube.com/playlist?list=PLL8woMHwr36EDxjUoCzboZjedsnhLP1j4

什么是多线程?

多线程意味着在一个应用程序中执行多个线程。线程就像执行应用程序的独立CPU。因此,一个多线程的应用程序就像多个独立cpu同时执行一个程序的不同部分。

在这里插入图片描述
然而一个线程并不是一个CPU,通常是一个单核CPU会在多个线程之间共享它的执行时间,即在给定时间内切换执行每个线程。应用程序的多个线程当然也可以由不同的CPU(指多核CPU)执行。
在这里插入图片描述

为什么要多线程?

在应用程序中使用多线程有一些原因的,这里列举几个常见的原因:

  • 更好利用单核CPU
  • 更好利用多核CPU,或者多个CPU
  • 用户更好的响应体验
  • 用户更好的公平性体验

在接下来的部分会有更详细的解释

更好利用单核CPU

能够更好地利用计算机资源是最常见的原因之一。例如,当一个线程正在等待网络请求的响应时,另一个线程可以使用CPU来做其他的计算。除此以外,如果计算机有多个CPU或者CPU是多核CPU,多线程也可以帮助你的应用程序利用这些额外的CPU内核。

更好利用多核CPU,或者多个CPU

如果计算机有多个CPU或者CPU是多核CPU,你需要实现多线程程序,以便充分利用你的所有CPU或者CPU的所有核心。单个线程最多只能使用单个CPU核心,如上文提到,甚至还不能充分利用单个CPU的性能。

用户更好的响应体验

另一个原因就是多线程能够提升用户体验。例如,如果你点击一个图形化界面的按钮,将会导致在网络上发送一个请求,关键的是哪个线程执行这个请求。如果你使用同一个线程去更新图形化界面,在线程等待请求的响应时,图形化界面就会发生‘“转圈圈(等待)”。换句话说就是,换成后台线程去执行这个请求,那么更新图形化界面的线程就可以自由的响应。

用户更好的公平性体验

第四个原因是在用户之间更公平的共享计算机资源。假设一个服务器从客户端接收请求,并且只有一个线程去执行这些请求。如果有一个客户端的请求要计算很久,那么其他的用户请求都要等待这个请求结束才能去处理。通过让每个客户端的请求由它自己的线程执行,那么没有任何一个任务可以独占CPU。

多线程VS.多任务

在过去,一台计算机只有一个CPU,并且只能执行一个程序。大多数小型计算机不能够同时执行多个程序,所以没有去尝试多线程。但是多年来,相对个人计算机,许多大型计算机系统能够同时处理多个项目。

多任务

后来出现了多任务处理,这意味着计算机可以同时执行多个程序(又名任务或专业程序)。但并不是真正的‘同时’,而是单个CPU在程序之间共享。操作系统会在运行的程序进行切换,在切换之前,每个程序会被运行一段时间。
多任务给软件开发人员带来了挑战,程序不能假定所有的CPU时间可用,也不能假定所有的内存或任何其他计算资源可用。一个“好公民”程序应该释放它不再使用的所有资源,这样其他程序就可以获得资源。

多线程

再后来就出现了多线程,这意味着你可以有多个线程在一个项目中。一个执行线程可以被认为是一个执行程序的CPU,当有多个线程执行同一个程序,就像一个程序在多个CPU中执行一样。

多线程是困难的

多线程可能是提高某些类型程序性能的一种很好的方法。然而,多线程要比多任务处理更具有挑战性。线程在同一个程序中执行,因此读取和写入相同的内存都是在同一时间的,这会导致出现单线程程序不可能出现的错误。在单个CPU中不可能真正同时执行两个线程,所以一些错误不能出现在单个CPU计算机中。现在计算机配备了多核CPU,甚至多个CPU,这意味着单独的线程可以由单独的核或CPU同时执行。
在这里插入图片描述
如果一个线程读取一个内存位置,而另一个线程写入它,第一个线程最终读取的值是多少?旧的值?第二个线程写入的值?还是两者混合的值?再或者两个线程同时写入同一个内存位置,最终的值是多少?第一个线程写入的值?第二个线程写入的值?或者两者混合写入的值?
如果没有适当的预防策略,这些结果都是可能的。这个结果是无法预测的,每一次的结果可能都是不同的。因此,作为一个开发人员,知道如何采取正确的预防策略是很重要的——这意味着学会控制线程如何访问共享资源,如内存,文件,数据库等。这是本Java并发教程要讨论的主题之一。

Java中的并发和多线程

Java是第一批对于开发者而言使多线程变得容易的语言。Java从一开始就具有多线程。因此,Java开发人员经常面临上述问题。这是我写这篇文章关于Java并发性的原因。对自己和任何其他可能从中受益Java开发人员而言,都是一份笔记。
本文主要讨论多线程,但是多线程中出现的一些问题与多任务和分布式系统中出现的问题类似。因此,多任务处理和分布式系统也可能出现在这篇文章中。所以使用“并发”而不单是“多线程”。

并发模型

第一个Java并发模型假设,多个线程内执行相同的应用程序也将分享对象。这种类型的并发模型通常称为“共享状态并发模型”。很多并发语言结构和实用程序是设计支持这个并发模型。
然而,自从Java并发编程第一本书发布后,甚至是Java 5并发实用程序发布以来,并发的架构和设计发生很大的变化。
共享状态的并发模型会导致大量的很难优雅解决的并发性问题。因此,另一种并发模型称为“无共享”或“独立状态”已经得到普及。在单独的线程状态并发模型不共 享任何对象或数据。这避免了大量的并发访问共享状态并发模型的问题。
新的异步“独立状态”平台和工具如 Netty 、Vert.x 、Play / Akka 和 Qbit 已经出现。新的非阻塞并发算法已经发布,非阻塞工具像 LMax Disrupter 已经加入到工具包中。在Java 7中,Fork和Join框架引入了新函数式编程并行性,收集流API被引入在Java 8中。
有了这些新开发,是时候更新这个Java并发教程。因此,本教程是再一次在进展中。只要有时间编写新教程,就会发布该教程。

java并发学习指南(以下尚未翻译,翻译后添加)

如果您是Java并发,我建议你遵循下面的学习计划。你可以找到所有的主题的链接在页面的左边菜单。
一般并发和多线程理论:

Java并发基础

  • 创建并启动线程
  • 竞争条件和临界区
  • 线程安全和共享资源
  • 线程安全和不变性
  • Java 内存模型
  • Java 锁阻塞
  • Java volatile关键字
  • Java 本地线程
  • Java 线程信号

Java并发中的典型问题

  • 死锁
  • 死锁预防
  • 饥饿和公平
  • 嵌套管程锁死
  • Slipped Conditions

解决上述问题的Java并发构造

  • Java中的锁
  • Java中的读写锁
  • 重入锁死
  • 信号量
  • 阻塞队列
  • 线程池
  • CAS机制

Java 并发实用程序(java.util.concurrent)

  • Java Concurrency Utilities - java.util.concurrent

进一步主题

  • 同步器的解剖
  • 非阻塞算法
  • Amdahl定律
  • 相关文档
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值