专栏首页海纳周报Java线程模型

Java线程模型

大家新年好。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的实现。也是很风骚的一种实现。大家有兴趣的可以下载来研究一下。

本文分享自微信公众号 - HinusWeekly(gh_4b8b4eda4e40),作者:海纳

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-01-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 多线程内幕

    本文是HinusWeekly第三期的第二篇文章,第三期的主题就是多线程编程。本文试图从单核CPU的角度讨论并发编程的困难。 函数调用的过程,就是不断地创建栈帧,...

    海纳
  • synchronized关键字的语义

    上一篇文章,我们讲到,如果发生了多个线程共同访问一个全局变量的时候,就会发生各种意料之外的情况。其实现实生活中有很多这样的例子。我举一个例子。 一群人都要过河,...

    海纳
  • 用Atomic实现锁

    一直想写ReentrantLock,就得先介绍AbstractQueueSynchronizer,可是我觉得这样写,不过瘾,我把代码贴一遍,懂的人自己就能找到这...

    海纳
  • JAVA中volatile、synchronized和lock解析

    在研究并发程序时,我们需要了解java中关键字volatile和synchronized关键字的使用以及lock类的用法。

    哲洛不闹
  • 传统多线程开发Android开发高级进阶

    之前的文章里写过了AsyncTask的一些坑,这次就不讲它了,使用传统的 Handler和Message来进行线程的使用,并且第一次添加了CallBack方式的...

    爱因斯坦福
  • Java Concurrent 背景&基础概念&操作系统

    并发可能在许多刚接触编程的程序员眼中显得高大上或者多余,因为刚接触编程时不是很理解 并发的背景、意义,并且并发编程通常相对于串行执行的程序要复杂一些。

    邹志全
  • JAVA\Android 多线程实现方式及并发与同步

    说到线程,就不得不先说线程和进程的关系,这里先简单解释一下,进程是系统的执行单位,一般一个应用程序即是一个进程,程序启动时系统默认有一个主线程,即是UI线程,我...

    Android技术干货分享
  • Java线程池深度揭秘

    Executor 是一个接口(主要用于定义规范),定义了 execute 方法,用于接收 Runnable 对象。

    一猿小讲
  • 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?

    使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成。这个期间如果使用 jstack 查...

    andyxh
  • 线程生命周期,五大状态转换分析

    本章学习完成,你将会对线程的生命周期有清楚的认识,并且明白不同状态之间是如何转换的,以及对java线程状态枚举类解读。

    公众号 IT老哥

扫码关注云+社区

领取腾讯云代金券