Java并发和多线程-1

什么是多线程?

为什么要多线程?
更好地利用单个CPU
更好地利用多个CPU或CPU内核
关于响应能力的更好的用户体验
关于公平的更好的用户体验

多线程与多任务
多任务
多线程
多线程很难
Java中的多线程和并发
并发模型
Java并发学习指南

Java 并发性是一个涵盖Java平台上的多线程,并发和并行性的术语。其中包括Java并发工具,问题和解决方案。该Java并发教程涵盖了多线程的核心概念,并发构造,并发问题,成本以及与Java中多线程相关的好处。

什么是多线程?

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


image.png

线程不等于CPU。通常,单个CPU将在多个线程之间共享其执行时间,并在给定的时间量内在每个线程的执行之间进行切换。也可以让应用程序的线程由不同的CPU执行。

image.png

为什么要多线程?

为什么要在应用程序中使用多线程有几个原因。多线程的一些最常见原因是:

更好地利用单个CPU。
更好地利用多个CPU或CPU内核。
关于响应性的更好的用户体验。
关于公平的更好的用户体验。
我将在以下各节中详细解释每个原因。

关于响应能力的更好的用户体验

使用多线程的另一个原因是为了提供更好的用户体验。例如,如果您单击GUI中的按钮,并导致通过网络发送请求,那么哪个线程执行此请求就很重要。如果使用的线程也正在更新GUI,则在GUI线程等待请求响应时,用户可能会遇到GUI“挂起”的情况。取而代之的是,这样的请求可以由背景线程执行,因此GUI线程可以自由地同时响应其他用户请求。

关于公平的更好的用户体验

第四个原因是在用户之间更公平地共享计算机资源。例如,假设一台服务器接收来自客户端的请求,并且只有一个线程来执行这些请求。如果客户端发送的请求要花费很长时间才能处理,则所有其他客户端的请求都必须等待,直到一个请求完成。通过使每个客户端的请求都由其自己的线程执行,则没有一个任务可以完全垄断CPU。

多线程与多任务

过去,一台计算机只有一个CPU,并且一次只能执行一个程序。大多数小型计算机的功能实际上不足以同时执行多个程序,因此没有尝试过。公平地讲,许多大型机系统能够一次执行多个程序的时间比个人计算机长得多。

多任务

后来出现了多任务处理,这意味着计算机可以同时执行多个程序(AKA任务或进程)。但是,这并不是真正的“同时”。单个CPU在程序之间共享。操作系统将在运行的程序之间进行切换,并在切换之前执行每个程序一会儿。

随着多任务处理,软件开发人员面临着新的挑战。程序不再假定拥有所有可用的CPU时间,也不拥有所有的内存或任何其他计算机资源。一个“好公民”程序应释放不再使用的所有资源,以便其他程序可以使用它们。

多线程

后来出现了多线程,这意味着您可以在同一程序中拥有多个执行线程。可以将执行线程视为执行程序的CPU。当您有多个线程执行同一程序时,就像在同一程序中执行多个CPU

多线程很难

多线程是提高某些类型程序性能的好方法。但是,多线程处理比多任务处理更具挑战性。这些线程在同一程序中执行,因此同时在读取和写入相同的内存。这可能会导致在单线程程序中看不到的错误。在单个CPU机器上可能看不到其中一些错误,因为两个线程从未真正“同时”执行。但是,现代计算机配备了多核CPU,甚至还配备了多个CPU。这意味着可以由单独的内核或CPU同时执行单独的线程。


image.png

如果一个线程在另一个线程写入内存位置时读取了一个内存位置,那么第一个线程最终将读取什么值?旧值?第二个线程写的值?还是两者之间混合的值?或者,如果两个线程正在同时写入同一内​​存位置,那么完成后将剩下什么值?由第一个线程写的值?第二个线程写的值?还是两个值的混合编写?
没有适当的预防措施,任何这些结果都是可能的。该行为甚至是不可预测的。结果可能会不时改变。因此,作为开发人员,重要的是要知道如何采取正确的预防措施-意味着学习控制线程如何访问共享资源(如内存,文件,数据库等)。这是本Java并发性教程解决的主题之一。

Java中的多线程和并发

Java是最早使开发人员可以使用多线程的语言之一。Java从一开始就具有多线程功能。因此,Java开发人员经常会遇到上述问题。这就是我在Java并发上编写此线索的原因。谨此提醒自己,以及可能从中受益的其他Java开发人员。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让...
    尧淳阅读 1,594评论 0 25
  • Java SE 基础: 封装、继承、多态 封装: 概念:就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽...
    Jayden_Cao阅读 2,109评论 0 8
  • 前言:虽然自己平时都在用多线程,也能完成基本的工作需求,但总觉得,还是对线程没有一个系统的概念,所以,查阅了一些资...
    justCode_阅读 708评论 0 9
  • 任务和线程的启动很容易。 在大多数时候, 我们都会让它们运行直到结束,或者让它们自行停止。然而,有时候我们希望提前...
    好好学习Sun阅读 1,150评论 0 0
  • 大家早上好!又是一天新的开始,今天闹钟没有响,但是自己还是在6:30醒过来,马上洗漱,坐在电脑旁,开始今天一天的第...
    朱一清阅读 103评论 0 0