Java多线程-进程与线程概述

192 阅读3分钟

1.程序,进程与线程

1.1 什么是程序

所谓程序,就是我们日常用编程语言编写创建的文件,如.java, .php, .h等等。 这些文件是数据和指令的集合,它们描述了希望计算机用什么样的指令去操作什么样的数据, 是静态的。

程序是数据与指令的集合。

1.2 什么是进程

程序是静态的,它放置在磁盘上,想要计算机运行它,需要将其载入内存,然后由 cpu读取指令并操作数据。这个过程就是进程。计算机想要运行程序,就需要为其 分配内存资源,cpu资源等计算机资源。 所以我们说

进程是程序的一次执行,进程是操作系统资源分配和调度的基本单位

1.4 单进程的缺点

  1. 浪费CPU资源

进程在执行过程中,需要CPU来调用指令做运算,运算是需要数据的,数据一般通过 IO设备获取,在从IO设备读写数据的过程中,CPU处于空闲状态

  1. 无法实时响应

如果进程A需要执行3个月,进程B需要执行3秒,进程A先执行的话进程B就需要 等到3个月后才能完成。

1.3 多进程

多进程引入了时间片的概念,为每个等待执行的进程分配时间片,时间片用完则 运行下一个进程,如果进程需要进行IO者将CPU资源也让渡给其他待执行的进程, 这样既提高了cpu的资源利用率又尽可能让执行时间短的进程快速响应,提高了使用 体验。

1.5 多进程的缺点

有的程序很简单,比如只输出了Hello World。有的程序很复杂,比如各种Web服务, 可能要运行几年的时间。但操作系统每次分配给进程的时间片很短,只执行了程序的一小部分指令, 却需要切换整个进程的上下文环境,这让操作系统在进程管理上耗费了更多的资源, 有没有办法减少这种资源上的浪费呢?于是出现了线程。

1.6 线程

如果说进程是程序的一次执行,那线程就是程序片段的一次执行。 有了线程之后,CPU就直接调度执行的线程,所以

线程是CPU调度和分派的基本单位

因此

线程的切换要比进程切换资源消耗少得多

线程由进程创建,没有独立的地址空间,它们共享创建它们的进程的内存空间

1.7 线程安全问题

线程安全问题一般出现多线程对共享资源的访问上出现的问题。 假设有两个线程同时对一个变量访问,会有以下三种情况:

  1. 读读:没有线程安全问题

  2. 读写:出现脏读,读线程无法读到最新值,出现数据不一致

  3. 写写:出现脏写,两个线程有一个的写操作被覆盖了,也称为丢失更新。

解决:

  1. 不要访问共享变量

  2. 设定共享变量不可变,也就是只存在读读的情况

  3. 对读写,写写操作做同步