Java线程模型

Java线程模型

本文将从线程类型、线程通信、线程调度三个方面分析Java中的线程模型。

什么是线程?

线程就是进程的切片。因为CPU速度太快,进程切换时cpu都要进行进程上下文的加载、保存操作。对CPU来说是巨大的性能浪费。所以引入线程的目的就是为了细化进程对CPU时间占用粒度,更加充分的利用CPU。

因为线程是对进程的切片,所以线程是共享进程资源的,同一进程里线程的切换不会影响进程的切换。

与进程的区别

  1. 进程是资源分配的最小单位,线程是调度的最小单位。
  2. 进程独占资源,线程共享进程资源。

线程的类型

内核线程(KLT)

内核线程就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。每个内核线程可以视为内核的一个分身,这样操作系统就有能力同时处理多件事情,支持多线程的内核就叫做多线程内核。

轻量级进程(LWP)

轻量级进程是由系统提供给用户的操作内核线程的接口的实现。即轻量级进程是内核线程的一个替身。

用户线程(UT)

用户线程建立在用户空间的线程库上,系统内核不能感知线程存在的实现。用户线程的建立、同步、销毁和调度完全在用户态中完成,不需要内核的帮助。如果程序实现得当,这种线程不需要切换到内核态,因此操作可以是非常快速且低消耗的,也可以支持规模更大的线程数量,部分高性能数据库中的多线程就是由用户线程实现的。

线程模型

一对一模型

一对一模型即轻量级进程的实现模式。一个LWP对应一个KLT。
优点:每个LWP都是独立的调度单元,一个线程阻塞不影响其他线程。
缺点:因为与KLT一对一。而KLT创建,调度需要一定内核资源,因此创建数量有限。

一对多模型

一对多模型及用户线程实现方式。一个进程对应多个UT。

优点:线程的管理在用户空间进行。比较高效。

缺点:需要用户自己考虑线程的调度相关问题,因为系统对UT无感知,所以一个线程阻塞会导致进程阻塞。

多对多模型

在一对多的基础上引入KLT。即一个进程管理多个KLT,KLT对应多个UT。
将 n 个UT映射到m个KLT上,要求 m <= n。

优点: 集合了前两种模型的优点,去掉了他们的缺点。
缺点:全是优点。

线程的调度方式

抢占式调度

每个线程由系统分配CPU时间,线程本身无法控制使用多次CPU时间。好处是线程的执行时间是可控的,不会造成因为一个线程导致进程长时间阻塞问题。

协同式调度

线程自己控制CPU时间。并且当前线程执行完毕后需要通知系统切换另外一个线程。最主要的问题是线程的切换取决于线程本身,若线程存在Bug导致切换线程不成功则会一直阻塞。

线程间通信与同步

线程虽然可以独立的执行。但是总会有需要不同的线程互相配合的情况,这就涉及到线程的通信与同步。目前有两种方式。

共享内存

共享内存的并发模型里线程通过显示的同步即通过互斥实现对公共空间的读写,将需要共享的数据同步到公共的内存中,这样便实现了间接的通信。即共享内存是显示同步,隐式通信。

消息传递

消息传递模型即消息传递,线程间无公共内存,因为消息通信天然具有先后关系所以间接实现类数据的同步。所以消息传递模型是显示通信,隐式同步。

Java中的线程

线程模型

目前Java默认使用的是一对一模型。即LWP方案。不过在支持多对多的平台上可以通过JVM参数控制使用多对多模型。

相关参数

-XX:+UseLWPSynchronization(默认值)
-XX:+UseBoundThreads

调度方式

Java采用抢占式调度。同时Java定义了10中线程优先级。可以在一定程度上调整线程的CPU时间。

通信机制

Java采用的是共享内存并发模型。具体可参考Java内存模型。

参考

  1. <<深入理解Java虚拟机: JVM高级特性与最佳实践>>
  2. <<Java并发编程的艺术>>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 要真正了解Java的多线程,我们还要从进程和线程的概念说起 进程 进程(Process)是计算机中的程序关于某数据...
    似水牛年阅读 5,500评论 1 11
  • 除了充分利用计算机处理器的能力外,一个服务端同时对多个客户端提供服务则是另一个更具体的并发应用场景。衡量一个服务性...
    胡二囧阅读 1,322评论 0 12
  • 1.概述 让计算机同时做几件事,一个很重要的原因是计算机的运算速度与它的存储和通信子系统速度差距太大,大量的时间花...
    过来摸摸头丶阅读 427评论 0 1
  • 作者:杨兴强原文来源:开点工作室(ID:kaidiancs) 一.从一个例子开始 看着Java线程执行起来的那种任...
    开点工作室阅读 6,763评论 2 28
  • 低沉的水坑佝偻着背 点缀在迟迟的微光里 雨伞撑小了 毛衣变大了 风也簇溜地吹起来了 如果天空在那时 多了一片孤寂的...
    玉米卷的夏天阅读 249评论 0 0