> 文章列表 > java 面试准备16

java 面试准备16

java 面试准备16

线程上下文切换

巧妙地运用了时间片轮转的方式,CPU给每一个任务都服务一定的时间,然后把当前任务的状态保存下来,在加载下一个任务的状态后,任务的状态保存再加载,这就叫上下文切换。

进程:有时候也叫任务,是指一个程序运行的实例。在Linux系统中,线程就是能并行运行并且与他们的父进程(创建他们的进程)共享同一个地址空间和其他资源的轻量进程。
上下文:是指某一个时间点CPU寄存器和程序计数器的内容。
寄存器:是CPU内部的数量较少但是速度很快的内存(与之对应的是CPU外部相对较慢的RAM主内存)。寄存器通过对常用值(通常是运算的中间值)的快速访问来提高计算机程序的运行速度。
程序计数器:是一个专用的寄存器,用于表明指令序列中CPU正在执行的位置,存的值为正在执行的指令的位置或者下一个将要被执行的指令的位置。

线程池原理

线程池的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后再线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。它的特点主要是线程复用;控制最大并发数,管理线程。

线程复用

每一个Thead的类都有一个start方法。当调用start启动线程时,Java虚拟机会调用该类的Run方法。那么该类的run()方法就是调用了Runnable对象的run()方法。我们可以继承重写Thred类,在其start方法中添加不断循环调用传递过来的Runnable对象。这就是线程池的实现原理。循环方法中不断获取Runnable是用Queue实现的,在获取下一个Runnable之前是可以阻塞的。

什么是CAS(Compare And Swap 比较并交换-乐观锁机制-锁自旋)

CAS算法包含三个参数,V表示要更新的变量,E表示预期值(旧的),N表示新值。当且仅当V等于E时,才将V的值设为N,如果V与E不同,则说明其他线程已经做了更新,则当前线程什么都不做,最后返回当前V的真实值。

CAS操作是抱着乐观的态度进行的,它总是认为自己可以成功完成操作,当多个线程同时使用CAS操作一个变量时,只有一个会胜出,并成功更新,其他都失败。失败的线程不会被挂起,仅仅告知失败,并且允许再次尝试。

数据库的三大范式是什么

第一范式:每个列都不可再拆分
第二范式:在第一范式的基础上,非主键完全依赖于主键,而不能依赖于主键的一部分
第三范式:在第二范式的基础上,非主键只能依赖于主键,不能依赖于其他非主键

MySQL存储引擎MyISAM与InnoDB区别

Innodb引擎:提供了对数据库ACID事务的支持,并且还提供了行级锁和外键的约束。它的设计目标就是处理大数据容量的数据库系统。
MyIASM引擎:它是MySql的默认引擎,不提供事务的支持,也不提供行级锁和外键。

什么是索引

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它包含着对数据表里面所有记录的引用指针。
索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以便于快速查询、更新数据表中的数据。
索引的实现通常使用B树及其变种B+树。更通俗的说法,索引就相当于目录。索引是一个文件,它通常需要占据物理空间。

索引有哪几种类型?

主键索引:数据列不允许重复,不允许为空,一个表只能有一个主键索引。
唯一索引:数据列不允许重复,允许为null,一个表允许多个列创建唯一索引。
普通索引:基本的索引类型,没有唯一性的限制,允许为Null值。

百万级别或者以上的数据如何删除

关于索引:由于索引需要额外的空间维护成本,因为索引文件是单独存在的文件,所以当我们对数据的增加,修改,删除,都会引起额外的对索引文件的操作,这些操作需要小爱好额外的IO。所以当我们要删除百万级别的数据时,查询MySQL官方手册得知删除的数据的速度与创建的索引数量成正比。
(1)我们首先删除索引。
(2)然后删除其中无效数据。
(3)删除后重新简历索引。

什么是数据库的事务

事务是一个不可分割的数据库操作序列。也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态到另一种一致性状态。事务是逻辑上的一组操作,要么执行,要么都不执行。

事务的四大特性

原子性:事务是最小的执行单位,不允许分割,事务的原子性确保动作要么都完成,要么都不起作用。
一致性:执行事务后,数据保持一致,多个事务对同一个数据的读取结果相同。
隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各个并发事务之间是相互隔离的。
持久性:一个事务被提交后,它对数据库的改变是持久的,即使数据库发生故障也不应该有影响。

搞笑GIF图片