
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在前几期的文章中给大家简单介绍了Java编程开发中线程与进程的一些基础知识等内容,而本文我们就继续来学习一下,Java编程协程的概念与优势分析。
1、协程是什么
协程(Coroutine)是用户态的线程。通常创建协程时,会从进程的堆中分配一段内存作为协程的栈。
线程的栈有8MB,而协程栈的大小通常只有KB,而Go语言的协程更夸张,只有2-4KB,非常的轻巧。
2、协程的诞生
根据维基百科的说法,马尔文·康威于1958年发明了术语“coroutine”并用于构建汇编程序,关于协程初的出版解说在1963年发表。
也就是历史上是先有的“协程”,再有的“线程”,线程是在在协程的基础上添加了栈等功能后扩展出来的。
但为什么一开始协程没有火起来呢?这个比较难考证,大概率还是与60年前的计算机时代背景有关。
而如今人们把协程调度的逻辑更进一步抽象为“等IO,让出,IO完毕”,在此基础上人们发现协程的方式能解决多线程环境下很多代码逻辑“混乱”。
3、协程的优势
既然线程似乎已经很好地填补了进程的遗憾,那怎么又出来了一个“协程”,难道是重复造轮子吗?
协程的优势如下:
节省CPU:避免系统内核级的线程频繁切换,造成的CPU资源浪费。好钢用在刀刃上。而协程是用户态的线程,用户可以自行控制协程的创建于销毁,极大程度避免了系统级线程上下文切换造成的资源浪费。
节约内存:在64位的Linux中,一个线程需要分配8MB栈内存和64MB堆内存,系统内存的制约导致我们无法开启更多线程实现高并发。而在协程编程模式下,可以轻松有十几万协程,这是线程无法比拟的。
稳定性:前面提到线程之间通过内存来共享数据,这也导致了一个问题,任何一个线程出错时,进程中的所有线程都会跟着一起崩溃。
开发效率:使用协程在开发程序之中,可以很方便的将一些耗时的IO操作异步化,例如写文件、耗时IO请求等。
协程本质上就是用户态下的线程,所以也有人说协程是“轻线程”,但我们一定要区分用户态和内核态的区别,很关键。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。