线程基础

Posted ymd12103410

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程基础相关的知识,希望对你有一定的参考价值。

cpu:承担所有计算的任务
操作系统:是计算机的管理者,它负责任务调度,资源分配和管理,统领整个计算机硬件
应用程序:是某种功能的程序,程序运行于操作系统上

进程由: 程序, 数据集合 和 进程控制块 三部分组成
程序:用于描述进程要完成的功能,是控制进程执行的指令集。
数据集合:是程序在执行时所需要的数据和工作区
程序控制块:包含进程的描述信息和控制信息,是进程存在的唯一标识

每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。

进程是操作系统分配资源的最小单位,线程是程序执行的最小单位(线程出现的一个原因是进程间切换开销较大)

各个线程之间共享程序的内存地址(也就是进程所在的内存空间)

一个标准线程:线程ID,当前指令指针(PC),寄存器和堆栈组成

进程:内存空间(代码数据,进程空间,打开的文件)和一个或多个线程组成

技术分享图片

进程与线程的资源共享关系

当线程的数量小于处理器的数量时,线程的并发是真正的并发,不同的线程运行在不同的处理器上,当线程的数量大于处理器的数量时,线程的并发会受到一些阻碍,此时不是真正的并发,因为此时至少有一个处理器会运行多个线程

频繁等待的线程:称为IO密集型线程

频繁进行大量计算以至于每次都把所有时间片全部耗尽,很少等待的线程:称为 CPU密集型线程

在优先级调度环境下,线程优先级的改变有三种方式
1.用户指定优先级
2.根据进入等待状态的频发程度提升或降低优先级(由操作系统完成)
3.长时间得不到执行而提升等级

要将多个线程对同一数据的访问同步,确保线程安全。

同步:即指一个线程访问数据时,其他线程不得对同一数据进行访问,即同一时刻只能有一个线程访问该数据

每一个线程在访问数据或资源之前,首先试图获取对该数据的锁,并在访问结束之后释放对该数据的锁,在锁被占用时试图获取锁,线程会进入等待状态,直到锁被释放数据再次变为可用。

二元信号量:有占用与非占用两种状态,适合只能被唯一一个线程独占访问的资源

当二元信号量锁被置为占用状态,之后其他试图获取该二元信号量的线程会进入等待状态,直到该锁被释放

多元信号量(简称信号量):允许多个线程访问资源,一个初始化值为N的信号量允许N个线程并发访问,线程访问资源时,首先获取信号量锁,进行如下操作:

1.将信号量值减一

2.如果信号量值小于0,则进入等待状态,否则继续执行

访问资源结束后,线程释放信号量锁,进行如下操作:

1.将信号量的值加1

2.如果信号量的值大于1,去唤醒一个等待中的线程

信号量在整个系统中可以被任意线程获取和释放,也就是说,同一个信号量,可以由一个线程获取,而由另一个线程释放,而互斥量则要求哪个线程获取了该互斥量锁就由哪个线程释放

临界区:是一种比互斥量更加严格的手段,互斥量和信号量在系统的任何进程都是可见的,也就是说一个进程创建了互斥量和信号量,另一个进程试图获取该锁是合法的,而临界区的作用范围仅限于本进程,其他进程无法获取该锁。

读写锁:允许多个线程同时对同一个数据进行读操作,而只允许一个线程进行写操作

有两种获取方式:共享的和独占的(Exclusive)

锁处于共享,其他线程以共享方式获取该锁仍能成功,此时该锁分配给了多个线程

处于独占状态的锁阻止任何线程获取该锁,不论它们以何种形式

读写锁的状态    以共享方式获取      以独占方式获取

    自由                            成功                      成功

    共享                            成功                      等待

    独占                           等待                       等待

引自:https://blog.csdn.net/luoweifu/article/details/46701167









以上是关于线程基础的主要内容,如果未能解决你的问题,请参考以下文章

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

JavaSE线程基础

Java——线程池

Java线程池详解

Java线程池详解

Java 线程池详解