同步与异步,阻塞与非阻塞的关系

这几个知识点其实用处很多,也是很容易搞混的,我们平时可能用了但是并没有发现,今天想来总结一下。
我第一次感受到同步异步的不同是在学习volatile的时候(因为我之前也没有多线程概念),之前也被同步啊这些概念搞的很乱。当我主线程新建了一个子线程之后两个线程是同时运行的,当时我才发现原来他们不是串行的,献丑了。好了进入正题。

从总体来看,同步和异步的概念是大于阻塞与非阻塞,并且他们之间没有对应关系。也就是说同步不一定是阻塞,异步也不一定是非阻塞的。阻塞和非阻塞只是一种性质,而同步和异步是从宏观上对一种任务性质的描述。
同步:如果有多个任务要发生,这些任务必须是挨个执行的,一个子事件或子任务的执行或导致主事件流的暂停或等待,这些事件不能并发的执行。
异步:多个任务或事件可以并发地执行,一个事件或任务的执行不会导致整个流程的暂停或等待。
最直观的来看:

void function(){
  fun1();
  fun2();
}

那么fun1()和fun2()就是串行运行,站在任务的角度我们可以说他们是同步的。(这里大家可以想一下多线程同步是要干什么?结合关于临界区的那个概念,我们的目的不就是要保证多个线程在访问临界区的时候要一个一个访问吗,要串行化,不能并发的访问。其实这就是我们多线程要解决的核心问题)

void function(){
  new Thread(){
    public void run(){
      fun1();
    }
  }.start();
  new Thread(){
    public void run(){
      fun2();
    }
  }.start();
 }

那么此时fun1()和fun2()就是并行执行的,因为多线程的本质就是并发运行。而且我们也可以通过thread.join()方法来让线程同步运行。
咱们再来点大白话的解释,比如任务A中间有一个子任务B,当执行B的时候A如果处于等待状态,那么就是同步的。如果A告诉B后,就由另一个线程去执行B,到时候执行完了自动返回给A的话,那么就是异步的。

阻塞和非阻塞可以看做一种性质,既然是性质,那么很多情况下都会存在。(可以多和io结合起来考虑)
阻塞:当某个事件或任务在执行过程中发出了一个请求操作,但是由于该请求操作需要的条件不满足,就会一直等在那,直到条件满足。比如我们都用过的:InputStream.read()/socket.read()/object.wait()等等,如果请求的资源没有准备好,那么请求的线程就阻塞在那了,只有等接受到数据之后才继续执行。
非阻塞:当某个事件或任务在执行过程中发出了一个请求操作后,但是由于该请求操作需要的条件不满足,那么被请求端会发出一个信息,告诉请求资源的线程,我这边资源没准备好,你可以去做其他的。
所以,其实阻塞和非阻塞咱们可以理解为,A请求B之后,在B端资源没准备好的时候,B是让A一直等待还是发出一个标志。

一定记住,这两组是完全不同的概念。同步不能和阻塞画等号(只能说同步往往是阻塞的),是不是阻塞咱们可以通过判断此刻主线程处于什么状态来判断。比如:在NIO中,我们有一种的多路复用模式。概念就是:我们不是采用一个线程去负责一个socket的方式,如果那样一定是阻塞的。我们采用一个线程管理多个socket的方式,该线程不断轮询所有socket,我们叫做Selector,通过select()方法,我们可以找到某一时刻真正需要io资源的socket,避免资源浪费。那么此时,我们的主线程是一直处于running状态的,因为他在不断轮询,但它同时又是非阻塞的,因为没有处于等待状态嘛。
同时异步也不一定是非阻塞的(只能说异步常常是非阻塞的),例如我们往线程池里面提交任务的时候,调用Future.get()来试图获取处理结果时,由于结果还没有运行出来,所以该方法会被阻塞。但是从多线程角度来看,此时它是异步执行的。
再用大白话解释一下,不敢保证一定准确无误,同步和异步我们描述的是多个线程之间的关系,而阻塞和非阻塞描述的是一个线程的属性。我们既然选择了多线程也就选择了异步编程的方式,但是却要解决同步的问题,而同步往往意味着性能的缺失和安全性的保障。而对于阻塞和非阻塞来说,传统的方式大多是阻塞的,如果采用异步非阻塞往往意味着更多的代码和资源投入,很多时候需要工作者线程甚至jvm底层的帮助

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

推荐阅读更多精彩内容

  • 今天是西方传统的情人节,中国年轻人特别喜欢今天这个节日,作为一个快进入大叔级的我,早晨起来对这个节日还是比较漠视,...
    一笑人生阅读 383评论 0 2
  • 两个室友,一个比我大一个比我小,姑且就以老大老二老三称呼吧。 片段一: 这段时间《成都》风靡全中国,几乎走到哪里都...
    脁登阅读 487评论 0 3
  • 我成长我幸福 大家晚上好,我叫简瑜我演讲的题目叫《我成长,我幸福》 自古以来,人们总是用诗一样的语言和火一样的...
    忘深秋的枫叶阅读 267评论 0 0
  • 踏上回家的路,有一种亲切感,那是三十年生活的地方,是一生中最难忘的记忆。 进村了,满是洁白的雪...
    lizhizhong1764阅读 362评论 0 1