7.线程上下文切换与阻塞队列
线程上下文切换CPU利用时间片轮询来为每个任务都服务一定的时间,然后把当前任务的状态保存下来,继续服务下一个任务。任务的状态保存及再加载交做线程的上下文切换。
进程:指一个运行中的程序的示例。在一个进程内部可以有多个线程在同时运行,并与创建它的进程共享同一个地址空间(一段内存区域)和其他资源。
上下文:指线程切换时CPU寄存器和程序计数器所保存的当前线程信息。
寄存器:指CPU内部容量较小但速度很快的内存区域(与之对应的是CPU外部相对较慢的RAM主内存)。寄存器通过对常用值(同创是运算的中间值)快速访问来加快计算机程序运行的速度。
程序计数器: 是一个专用的寄存器,用于表明指令序列中CPU正在执行的位置,存储的值为正在执行的指令的位置或者下一个将被执行的指令的位置,这依赖于特定的系统。
上下文切换上下文切换指的是内核(操作系统的核心)在CPU上对进程或者线程进行切换。上下文切换过程中的信息被保存在进程控制块(PCB-Process Control Block)中。PCB又被称作切换桢(SwitchFrame)。上下文切换的信息会一直被保存在CPU的内存中,直到被再次使用。上下文的 ...
6.java中的锁
Java中的锁java中的锁主要用于保障多并发线程情况下数据的一致性,在多线程编程中为了保障数据的一致性,我们通常需要在使用对象或者方法之前加锁,这是如果有其他线程也需要使用该对象或者该方法,则首先要获得锁,如果某个线程发现锁正在被其他线程使用就会进入阻塞队列,等待锁的释放,知道其他线程执行完成并释放锁,该线程才有机会再次获取锁进行操作。这样就保障了在同一时刻只有一个线程持有该对象的锁并修改对象,从而保障数据的安全。
乐观锁与悲观锁乐观锁乐观锁采用乐观的思想处理数据,在每次读取数据时都认为别热不会修改该数据,所以不会上锁,但更新时会判断此期间别人有没有更新该数据,通常在写时先对出当前版本号然后加锁的方法。具体过程为:比较当前版本号与上一次的版本号,如果版本号一致,则更新,如果版本号不一致,则重复进行读、比较、写操作。
java中的乐观锁大部分是通过CAS(Compar And Swap, 比较和交换)操作实现的,CAS是一种原子更新操作,在对数据操作之前首先会比较当前值传入的值是否一样,如果一样则更新,否则不执行更新操作,直接返回失败状态。
悲观锁悲观锁采用悲观思想处理数据,在每次读 ...
5.线程的生命周期和常用方法
线程的生命周期当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,它要经过 新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。尤其是当线程启动以后,它不可能一直”霸占”着CPU独自运行,所以CPU需要在多条线程之间切换,于是 线程状态也会多次在运行、阻塞之间切换。
12345678public enum State { NEW, // 新创建的线程,未调用 start() 方法 RUNNABLE, // 线程正在运行中:可能是在 JVM 中运行,也可能在等待 CPU 时间片 BLOCKED, // 阻塞状态: 正等待锁的释放以进入同步区 WAITING, // 等待状态: 需要被其他线程唤醒才能重新进入 RUNNABLE 状态 TIMED_WAITING, // 超时等待状态: 等待一个具体的时间段,到期会被自动唤醒 TERM ...
4.常用的线程池
常用的线程池Java定义了Executor接口并在该接口中定义了execute()用于执行一个线程任务,然后通过ExecutorService实现Executor接口并指向具体线程操作。ExecutorService接口有多个实现类可用于创建不同的线程池。
名称
说明
newWorkStealingPool
可缓存的线程池
newFixedThreadPool
固定大小的线程池
newScheduledThreadPool
可做任务调度的线程池
newSingleThreadExecutor
单个线程的线程池
newWorkStealingPool
足够大小的线程池,JDK1.8新增
newWorkStealingPool12345public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SEC ...
3.线程池的工作原理
线程池的工作原理Java线程池主要用于主要用于管理线程组及其运行状态,以便java虚拟机更好地利用CPU资源。Java线程池的工作原理为:JVM先根据用户的参数创建一定数量的可运行的线程任务,并将其放入队列中,在线程创建这些任务,如果正在运行的线程数量,超过了最大线程数量(用户设置的线程池大小),则超出数量的线程派对等候,在任务执行完毕后,线程池调度器会发现有可用的线程,进而再次从队列中取出任务并执行。
线程池相关概念
核心线程CorePool:当有新任务提交时,如果核心线程都在工作,并且数量已经达到最大核心线程数,则不会新建核心线程,而是把任务放入等待队列。
阻塞队列 workQueue: 等待队列是一个线程安全的阻塞队列。当线程都在忙时,阻塞队列用于存放新增的任务。核心线程完成当前任务回去等待队列中拉取新出的任务。
非核心线程: 当等待队列满时,若当前总线程线程数没有查过最大线程数,则会创建新的非核心线程。
核心线程与非核心线程没有区别,只会在比较线程池中线程数目时,区分核心线程与非核心线程。
线程活动保持时间keepAliveTime: 当一个线程空闲下来之后,其保持继续存 ...
2.java中多线程的实现
Java多线程编程java给多线程编程提供了内置的支持。一个线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程 ,每条线程并行执行不同的任务。
一个进程包括由操作系统分配的内存空间,包括一个或多个线程。一个线程不能独立的存在,他必须是进程的一部分。一个进程一直运行,直到所有的非收回线程都结束运行后才能结束。
一个线程的生命周期线程是一个动态执行的过程,它也有一个从产生到死亡的过程。
新建状态
使用new关键字和Thread类或器子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序start()线程。
就绪状态
当线程对象调用了start()方法之后,该线程就进入了就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。
运行状态
如果就绪状态的线程以获取CPU资源,就可以执行run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,他可以变为阻塞状态,就绪状态和死亡状态。
阻塞状态
如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得 ...
1.Java集合-框架
Java集合[1]–java集合分类之前大概分为三种,Set,List,Map三种,JDK5之后,增加Queue.主要由Collection和Map两个接口衍生出来,同时Collection接口继承Iterable接口,所以我们也可以说java里面的集合类主要是由Iterable和Map两个接口以及他们的子接口或者其实现类组成。我们可以认为Collection接口定义了单列集合的规范,每次只能存储一个元素,而Map接口定义了双列集合的规范,每次能存储一对元素。
Iterable接口:主要是实现遍历功能
Collection接口: 允许重复
Set接口:无序,元素不可重复,访问元素只能通过元素本身来访问。
List接口:有序且可重复,可以根据元素的索引来访问集合中的元素。
Queue接口:队列集合
Map接口:映射关系,简单理解为键值对<Key,Value>,Key不可重复,与Collection接口关系不大,只是个别函数使用到。
整个接口框架关系
Iterable接口12345678910// 返回一个内部元素为T类型的迭代器(JDK1.5只有这个接口)Itera ...
win10连接linux服务器的工具
常用的远程连接Linux工具常用的远程连接Linux工具有:Vscode、XShell、FinallShell等。下面重点介绍该三种工具:
1 VsCode的Remote插件Vscode是一款开源的跨平台编辑器。默认情况下,vscode使用的语言为英文(us)
1.1 下载安装官方下载地址:https://code.visualstudio.com/#alt-downloads
选择自己的系统版本,安装时一直下一步即可,安装完成后直接运行code.exe
1.2 修改vscode为中文环境
使用快捷键【Ctrl+Shift+X】,在搜索框中输入“chinese”,选择安装 中文(简体) install;
再次使用快捷键【Ctrl+Shift+P】,在搜索框中输入“configure display language”,选择 zh-CN ,确认重启即可。
1.3 修改主题颜色使用快捷键【Ctrl+K 】【Ctrl+T 】弹出选择框,选择自己喜欢的主题
1.4 安装Remote-SSH直接打开vscode中的插件搜索SSH找到Remote-SSH直接安装即可。
1.5 配置R ...
十大经典排序算法(Java实现)
排序算法概述定义将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序。
分类十种常见排序算法可以分为两大类:
非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。
比较
相关概念
稳定:如果a原本在b前面且a=b,排序之后a仍然在b的前面。
不稳定:如果a原本在b的前面且a=b,排序之后 a 可能会出现在 b 的后面。
时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。
内部排序:所有排序操作都在内存中完成。本文主要介绍的是内部排序。
外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需要对外存进行访问的排序过程。
各算法原理及实现下面我们来逐一分析十大经典排序算法,主要围绕下列问题展开: 1、算法的基本思想是什么? 2 ...
2.操作系统-进程管理
进程与线程进程程序与进程进程是计算机中处于运行中程序的实体。程序本身只是指令、数据及其组织形式的描述,进程才是程序(指令和数据)的真正运行实例。
进程结构一般由3部分组成:代码段、数据段和堆栈段。代码段用于存放程序代码数据,数个进程可以共享同一个代码段。数据段存放程序的全局变量、常量和静态变量。堆栈段中栈用于函数调用,它存放着函数的参数,它存放着函数的参数,函数内部定义的局部变量。堆栈段还包括了进程控制块(Process Control Block, PCB)。PCB处于进程核心堆栈的底部,不需要额外分配空间。PCB时进程存在的唯一标识,系统通过PCB的存在而感知进程的存在。
进程是程序的一次执行
进程是一个程序及数据在处理机执行时所发生的活动
进程时系统进行资源分配和调度的独立单位。进程的独立运行由进程控制块PCB控制和管理。进程映像时静态的进程。程序段、相关数据、PCB三部分构成了进程映像。
进程具有动态性(创建、活动、暂停、和终止、具有生命周期),并发性(多个进程在一段时间内同时运行),独立性(进程是一个独立运行、获得资源和接受调度的基本单位)、异步性(进程按照独自不可预知的速 ...