Java并发编程之进程与线程

我们来看一下操作系统、进程、线程的包含关系:

  • 操作系统是包含多个进程的容器,而每个进程是包含多个线程的容器

什么是进程?

  • 代码角度:把一个类new出来是一个实例化的过程,进程就是对代码的一种实例化;
  • 总结:进程是程序(理解为我们写的代码)的真正运行实例,是系统资源(内存、CPU等)分配和调度的基本单位;

什么是线程?

  • 线程是CPU的基本调度单位,每个线程执行的都是进程代码的的某个片段;
  • 多个线程来帮助同一进程来执行代码;

进程和线程的异同

  • 起源不同,先有进程再有线程为了提高CPU的利用率,才诞生了线程
  • 概念不同,进程是有独立功能的程序运行起来的活动,是系统分配资源(内存、CPU等)和调度的基本单位;而线程是CPU的基本调度单位
  • 内存共享方式不同,对于进程而言,不同的进程都会被操作系统分配一定的内存,但是不同进程的内存通常不共享,线程与线程之间的内存共享起来非常容易,因为本身服务于一个进程,所以线程可以直接访问共享内存,不需要处理
  • 拥有的资源不同,线程之间共享的内容包括:进程代码段、进程的共有数据、进程用户ID与进程组ID;线程独有的内容包括:线程ID、线程的堆栈
  • 数量不同,一个进程至少得拥有一个线程,否则就没有办法执行了;
  • 开销不同,线程的创建、终止、线程的切换开销都小于进程
  • 生命周期相同,进程和线程从创建到结束都有就绪,等待,运行

什么是多线程?

  • 多线程是指如果一个程序允许两个或以上的线程,那么它就是多线程程序。多线程是指在单个进程中运行多个线程
  • 使用多线程最主要的目的:提高CPU利用率,可以提高处理速度,避免无效等待,卡顿等问题;

使用场景

  • 多任务
  • 高并发
  • NIO

多线程的局限

  • 性能问题:上下文切换带来的消耗
  • 线程安全问题:数据安全问题(比如i++),死锁,活跃性问题(饥饿、活锁)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章