前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java线程模型

Java线程模型

作者头像
海纳
发布2018-03-02 14:45:20
1.2K0
发布2018-03-02 14:45:20
举报
文章被收录于专栏:海纳周报

大家新年好。2018年的第一期来得晚了一些。因为年底有很多工作要做,加班多了一些,公众号停更了两周。

今天借着知乎上一个关于线程模型的问题,我正好可以讲一下Java的线程模型。

先来一段视频,带大家浏览一下JDK的源代码:

在早期的linux系统里,是没有线程支持的,操作系统分配资源的单位是进程,然后执行单元也是进程。说详细点就是,每个进程有自己的内存,文件描述符,IO端口等,你不能随便访问其他进程的资源,分配给你,就是你的了,别人看不到。而那时候的进程都是单线程的,所有的进程在同一个CPU上分时执行。

后来,使用并发程序提高程序的速度以后,一个进程做为一个执行单元就有些重了。这时就引入了线程的实现(线程的概念是很早的概念了,但在操作系统中真正地大规模使用比起概念的提出可能要晚了二十年左右)。在linux里,早期线程的实现,其实就是引入了个PCB(process control block),然后有个独立的栈。大家可以回忆一下fork的实现,copy_on_write,其实只要改一下,write的时候就直接write,别copy,这不就是新fork出来的一个process(这个时候比较混沌,讲不清楚是进程,还是线程,就用process代替吧)可以访问老的进程,这玩竟儿,有人叫它轻量级进程,有人叫它线程,总之是提高了整个系统的并发能力就是了。当然,后来线程机制做得越来越完善,并发控制,消息等都有了很好的支持,就是大家现在看到的样子了。

线程有自己的独立的栈,调度也依赖操作系统,但是大家还是不满意,觉得线程消耗资源太大了,例如在linux上,一个线程默认的栈大小是1M,创建几万个线程就压力山大。所以,后来在编程语言的层面上,就有了协程这个东西。

目前来说,编程语言里对协程支持最好的是go语言。协程使用栈内存是按需使用的,所以可以随随便便创建百万级的协程。而这些协程本质上还是要依托于具体的操作系统线程去执行的。比如说我创建了M个协程,然后在N个线程上执行,这就是M:N的方案。显然,Java里是没有协程的。当然,现在OpenJDK社区的 loom 项目正在努力为JDK增加协程。

这个项目是Ron Pressler主导的,他在加入Oracle之前,做了一个名为quasar的实现。也是很风骚的一种实现。大家有兴趣的可以下载来研究一下。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HinusWeekly 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档