美文网首页
Java--线程

Java--线程

作者: aruba | 来源:发表于2021-10-10 13:15 被阅读0次
线程是什么?在计算机设计初期,并没有线程的概念,只有进程,linux系统下没有真正意义的线程,只有进程,c语言中的fork函数可以开辟一个新的进程,新的进程将对父进程进行内存拷贝,相当于复制全新的一个父进程,全新的内存,进程间内存的独立使得进程间通信较为繁琐
由于进程间内存不共享,而我们做多进程操作时,为的就是并发进行某些操作,最后得到结果,并发操作时想用同一个对象,就需使用共享内存进行多进程通信,共享内存是允许多个进程访问同一个内存空间,是在多个进程之间共享和传递数据最高效的方式
多进程编程时我们需要用到大量得共享内存操作,十分繁琐,这时就有人提出了线程,线程就是对进程进行了封装,linux中的线程就是模拟进程。而我们知道线程的好处就是内存共享,使用它带来了很大的便利,同时它也带来了一些坏处:线程安全、线程生命周期等

一、Java使用的线程模型

1.三种线程模型

主流操作系统的线程模型有三种:内核线程模型、用户线程模型、混合线程模型,感兴趣的可以自己查阅相关资料
HotSpot虚拟机使用的是内核线程模型(Kernel-Level Thread, KLT):由操作系统内核(Kernel,下称内核)支持的线程,这种线程由内核来完成线程切换,一个线程对应一个内核线程,注意内核线程也是进程

2.多线程实现

线程模型只是概念,具体是怎么实现的呢?如果有linux下c语言编程的经验,我们可以知道线程就是模拟的进程,试想下:如果要你来设计一个多线程模型,你会怎么做?
我们需要尽可能的把进程轻量化来实现线程,但又想到它能够做到内存共享,子进程又是需要被父进程fork出来,显然一个进程并不能做到这些,那么怎么做呢?

  • 将一个进程只作为内存共享进程,用来fork的父进程A
  • 将另一个进程用来调度,当有新的线程创建时,来通知进程A可以fork了,并管理它们一系类操作

linux中,对上面两个进程分别称作:

  • 轻量级进程(Light Weight Process,LWP):就是内核线程(KLT),程序一般不会去使用内核线程,而是使用内核线程的一种API—— 轻量级进程(Light Weight Process, LWP),可以共享应用程序的一些资源,比如地址空间、句柄、堆
  • 调度器(Thread Scheduler):协同式线程调度(Cooperative Thread-Scheduling)和抢占式线程调度(Preemptive Threads-Scheduling),后续再来了解这两个概念
3.Java使用的线程模型

上面提到了HotSpot虚拟机使用的是内核线程模型(Kernel-Level Thread, KLT),我们又做了多线程实现的分析,再来看内核线程模型,如下图所示:

内核线程模型

二、时间片轮转机制

之前的JVM文章中也提到了,计算机实际上是没有并行的,而是每个线程(进程)抢占获得cpu的时间片,来执行一段时间后,重新竞争,所以JVM内存模型中有程序计数器,上面提到的线程的调度器也是这种机制

1.协同式线程调度(Cooperative Thread-Scheduling)

线程的执行时间由线程本身来控制,执行结束后需要主动通知系统切换到另外一个线程上,其危险性也很大,当一个线程陷入了死循环,那么程序会一直阻塞,可能导致系统崩溃

2.抢占式线程调度(Preemptive Threads-Scheduling)

为了解决协同式线程调度的危险,抢占式线程调度就是时间片轮转机制,各个线程只能被动的抢占cpu时间片,抢占到了的才能执行代码,时间到了后,暂停执行,重新由各个线程竞争时间片,这种方式线程的执行时间系统是可控的,不会造成协同式线程调度一直阻塞的现象,Java使用的是抢占式线程调度

Java线程调度

三、Java并发特性

Java线程是在操作系统的内核线程模型上做了进一步的封装,Java多线程特性有三个:原子性、可见性、有序性,上面我们了解到了轻量级进程中有共享的内存,来实现多线程的内存共享。而HotSpot虚拟机通过虚拟机栈来对应一个线程,在虚拟机栈中又存有一个个栈帧来对应方法,里面会通过局部变量表存储一个指针指向堆中共享的对象,但是实际操作时并不是直接使用共享内存的,而是共享内存的拷贝


这种方式被称为JMM模型,下篇文章会围绕JMM模型进行展开

相关文章

  • Java--线程

    线程 线程(Thread)是操作系统中能够调度的最小单位,被包含在进程之中,是进程的实际运作单位,一条线程是...

  • Java--线程

    线程是什么?在计算机设计初期,并没有线程的概念,只有进程,linux系统下没有真正意义的线程,只有进程,c语言中的...

  • Java--多线程

    多线程 线程的五个状态新建,就绪,执行,等待,销毁 新建线程需要调用start()方法才会进入就绪状态 处于就绪状...

  • Java--线程池

    线程池(Thread Pool):顾名思义,就是类似于一个充满了线程的池子,它其实是一种线程的使用模式,是一种池化...

  • Java--多线程

    进程和线程的区别 进程时资源分配的最小单位,线程时CPU调度的最小单位 线程不能看作独立应用,而进程可看作独立应用...

  • Java--线程池

    Java中提供了一系列和锁相关的工具:synchronized、ReentrantLock、AtomicXXX类,...

  • Java--优化利用TCP实现文件上传(多线程)

    Java--优化利用TCP实现文件上传(多线程) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学...

  • Java--多线程锁机制

    上次通过三个例子,了解了Java并发三个特性,也分析了volatile不能解决原子性问题的原因,要解决原子性问题,...

  • Eclipse 开发基本配置与快捷键

    自动提示Window -->> Preferences -->> Java-->> Editor-->> Cont...

  • Eclipse自动补全

    Windows——>Preferences——>Java-->Editor-->Content Asist,在Au...

网友评论

      本文标题:Java--线程

      本文链接:https://www.haomeiwen.com/subject/qhcholtx.html