goroutine相比java 多线程NIO有何优势

 我来答
就烦条0o
2017-02-13 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46493
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
NIO(非阻塞IO)是一种IO编程模型,Golang中的IO底层实现方式和java NIO模型一致,通俗点说就是都采用了EPOLL。 你在使用golang读文件的时候,goroutine 会默默的挂起,只是你不知道,当读完毕了,goroutine 再次恢复,但你不用担心,goroutine 的挂起和恢复没有java线程那样可怕,你可以认为goroutine 的挂起和恢复就是保存和恢复几个变量的值,其实也是这样的。
剩下的就是goroutine 和 java线程的区别了,goroutine是用户态的线程切换,java采用的是系统线程切换,用汇编语言描述是一个(java)调用int 80软中断,一个没有。 意味着goroutine更轻量级,可以同时相应成千上万的线程切换,java你创造上千个线程就有些吃力了。
因为java线程不能创造过多的线程,如果同时处理上万上千的请求时候,就要考虑在几十个线程来处理上万上千的请求,这就出现了很多请求和线程不可能一一对应,所以通常做法是每个线程分别处理单个请求各个阶段。好比流水线,请求是要加工的商品,每个线程处理一道工序,这样做的好处是每人都做自己熟悉的,对于程序来说每个线程执行的代码永远都是自己很短的一块,这样根据局部优化原理,更具备CPU,内存亲和力,利于JIT。说这样多,就是说如果线程和请求不能一一对应,流水线式的并发编程很麻烦,阅读性也很差,通常是线程A里面一段逻辑代码,线程B又有另一处处理的逻辑代码。
由于goroutine 的轻便,你可以将请求和goroutine 一一对应起来,不用考虑将请求在线程之间换来换去,只关心你的业务逻辑,这就是goroutine 的好处。
总结:
golang的goroutine让你比java更容易编写并发程序,但性能不会有差别(目前来说,golang性能还不能和java比,看过代码就知道了,GC弱到爆),代码不会减少,该写的逻辑还得写。ps,其实golang的(sched)go程切换代码虽然原理和java的fork-join框架一样,但是fork-join比golang的sched代码牛逼不少,开始膜拜Doug Lea吧,golang还有很长的路要走。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式