同步、异步、阻塞、非阻塞
一.介绍
阻塞和非阻塞指的是执行一个操作是等操作结束再返回,还是马上返回。同步和异步又是另外一个概念,它是事件本身的一个属性。
二.例子
去书店借一本书,同步就是我要亲自到书店,问老板有没有这本书,阻塞就是老板查询的时候(读写)我只能在那等着,老板找到书后把书交给我,这就是同步阻塞。
我亲自到书店借书,老板在找这本书的时候,我可以去干别的(比如去下一个书店借书),然后每隔一段时间去问老板书找到了没有,也可以等老板找到书以后通知我,这就是同步非阻塞。
我想借本书,找个人帮我去借,借到书以后再通知我(那个人会等老板找完书),这就是异步,我只发起调用,但是本身并不参与这个事件,而是让别的线程去做这个事。这就是异步阻塞
我想借本书,找个人帮我去借,借到书以后再通知我(那个人会找多个老板借书),这就是异步,我只发起调用,但是本身并不参与这个事件,而是让别的线程去做这个事,别的线程也处理多个事物。这就是异步非阻塞
三.好处
同步非阻塞,当那个人有事有问题挂掉了,会导致什么情况呢?即使那个人可以去借多个书,但是他挂掉了就全没了。
异步非阻塞,这样多个人去借多本书,一个人挂掉不会影响其他人。但是借书的人不能太多,否则cpu切换线程将会很消耗cpu。(Nginx的工作进程一般设置为核心数,也是这个原因)
四.总结
同步与异步是对应的,它们是线程之间的关系,两个线程之间要么是同步的(同步的话,那就只有一个线程),要么是异步的(多个线程)。
阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。
帮我借书的那个人有没有借到书,我可以打电话问他(轮询),也可以等他通知我,这是异步的通知;在借书的过程中借书的那个人可以轮询的方式查看书是否已经找到(缓冲区有没有数据),找到了你可以把它拿走,也可以等老板找到书后通知我,这是非阻塞的通知与轮询。