jenkov - 1.Java并发与多线程教程

什么是多线程

多线程的意思是在一个程序里有多个线程执行。一个线程就像一个独立的CPU在执行你的程序。所以,多线程程序就像是有多个CPU在同一时间执行不同部分代码的程序。


但是一个线程不是一个CPU。通常一个单独的CPU会在多线程之间共享它的执行时间,在线程执行了一定时间后进行切换。多线程也可能被不同的CPU执行。


为什么要用多线程

使用多线程的原因有很多。最通常的原因有:

  • 更好利用单个CPU
  • 更好利用多个CPU或CPU核
  • 在响应方面,有更好的用户体验
  • 在公平方面,有更好的用户体验

更好利用单个CPU

一个最普遍的原因是为了能够更好的利用计算机资源。例如,如果一个线程正在等待网络上的一个请求,那么另一个线程能够在此时利用CPU去做其它的事情。另外,如果计算机有多个CPU,或者CPU上有多个执行核心,那么多线程能够帮忙你的程序利用这些额外的CPU核。

更好利用多个CPU或CPU核

如果计算机有多个CPU,或者CPU上有多个执行核心,那么你需要在你的程序中使用多线程去利用所有的CPU或CPU核心。一个的线程最多利用一个CPU,就像上面提到那样,有时还不能完成利用一个CPU。

在响应方面,有更好的用户体验

另一个使用多线程的原因是为了提供更好的用户体验。例如,如果你在一个界面上点击了一个按钮,发起了一个网络上的请求,那么由哪个线程来执行这个请求很重要。如果你用更新界面的那个线程,那些在等待响应期间,用户可能会感觉到界面卡了。相反,这个请求可以被后台一个线程执行,那么更新界面的线程就能够继续响应用户的其他请求。

在公平方面,有更好的用户体验

第4原因是在用户之前更公平的共享资源。想像有一台服务器,它接受从客户端来的请求,并且只有一个线程去执行这些请求。如果一个客户端发送了一个需要处理很长时间的请求,那么所以其他客户端的请求将不得不等待那个请求完成。如果让每个客户端的请求在它们自己的线程中执行,那么就没有一个任务能够完全独占CPU。

多线程与多任务对比

在过去,计算机只有一个CPU并且一次只能执行一个程序。大部分小型机不够强大去同时执行多个程序,所以并没有尝试。公平的说,许多大型机系统在同时执行多个程序的方面比个人电脑要多许多年。

多任务

之后多任务的出现,说明计算机能够同时执行多个程序(也就是任务或进程)。但它并不是真正的“同时”。CPU被多个程序共享。操作系统会控制每个任务在执行一小段时间后进行切换。

多任务给软件开发者带来了新挑战。程序员不再假定能够获取所有的CPU时间,或所有内存或所有其他资源。一个“好市民”的程序,在不需要使用时释放所有资源,以便其它程序能够使用。

多线程

后来多线程出现,意味着在一个程序里能够使用多个线程执行。一个线程执行可以想像成一个CPU在执行程序。当你使用多线程时,就像有多个CPU执行同个程序。

多线程是困难的

多线程能够非常有效提高某此程序的性能。然而,多线程比多任务更有挑战性。多个线程在同个程序中执行,所以会同时读取与写入内存。这会导致一些单线程程序里没有的错误。这些错误在单CPU的机器可能不会出现,因为两个线程不可能同时执行。然而,现代计算机有多个CPU核心,甚至也有多个CPU。这意味着不同线程能够同时地被不同的CPU执行。


如果一个线程读取的内存位置,有另一个线程在写入,那么第一个线程会读取到什么值?旧值?还是第二个线程写入的值?或者是两者间的混合值?又如果,两个线程同时写入相同的内存位置,最后会是什么值?第一个线程写入的值?第二个线程写入的值?又或者各写一半的值?

没有适当的预防措施,以上的结果都有可能。上述行为并不能被预知。结果每次都会不同。所以开发者懂得采取正确的预防措施是很重要的:意思是学习如何控制线程访问共享资源,如内存、文件和数据库等。

并发模型

Java并发模型最初假设多个线程在相同的程序中执行并且共享对象。这种模型被称为“共享状态的并发模型”。许多并发语言结构和工具都是设计成支持这种并发模型的。

然而,时至今日,并发架构和设计已经发生了变化。

共享状态的并发模型引起许多很难解决的并发问题。所以,一个可选的、被称为“不共享”或“独立状态”的并发模型正在流行起来。在独立状态的并发模型中,线程不共享任何对象和数据。这避免了很多共享状态并发模型的并发访问问题。

全新且异步的“独立状态”平台和工具,如Netty、Vert.x 和 Play / Akka 和 Qbit,涌现了。全新的非阻塞并发算法被发布,并且全新的非阻塞工具如LMax Disrupter已经加入到我们的工具当中。
还有Java 7的Fork / Join 框架、Java 8的集合流API。

引用

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

推荐阅读更多精彩内容