1、mysql上千万数据查询增加索引提高查询效率的底层原理?
索引是有序的 索引的数据结构:二叉树、红黑树、hash表、B-tree https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
假如索引的数据结构为 二叉树(由跟节点开始左边小 右边大) 查询数据的时候先去查找索引,由于二叉树的数据结构 很快能定位到索引,所用和对应表数据的位置是key value形式的 根据key 找到对应数据的位置 避免了全表扫描 提高查询效率
2、如果未加索引 sql查询是怎么执行的
根据某个字段值去查询 该表的对应数据 ,数据分散在磁盘中存储 ,执行查询指令,拿到结果跟条件作比对,每进行一次操作,就做了一次磁盘IO操作,如果数据越靠后,所产生的磁盘IO次数就越多,查询效率就越慢。
3、arrayList 和 linkedlist 的区别
arraylist 数据结构是动态数组,linkedList 是双向链表的数据接口 ,数据结构也就决定了 arraylist 查询效率最高,根据下标就能定位到对象位置,但也存在 插入 或者删除 效率慢的问题,比如在中间插入某个对象,后边对象的位置都要移动 所以效率不高。linkedList 有比较高的插入或者删除的效率,比如插入某个对象 linkedList 只需要改动其指针指向就可以,但也存在着查询效率低下的问题,linkedList 除了存储当前对象 还会存储前后对象的位置,linkedList查询时会逐个筛查 指导找到所查的对象为止。
4、多线程并发
线程和进程的区别: 进程是操作系统进行资源分配的最小单元,线程是操作系统进行任务分配的最小单元,线程隶属于进程。
如何开启线程: 1、集成Thread类 重写run方法 2、实现runnable接口 重写run方法 3、实现callable接口 重写 call方法 4、通过线程池来开启线程 设计两种的目的是 设计者考虑java语言的特性为 单继承多实现的特点
怎么保证线程安全: (线程安全指的是 多个线程操作一个资源时出现的问题)核心思想 加锁, 加锁的方式:1、jvm提供的锁 synchronized 2、JDK提供的各种锁Lock
volatile 和synchronized 的区别: synchronized是用来线程加锁,使线程串行执行,volatile 是用来保证变量的可见性(通常适用于一个线程写多个线程读的场景)
volatile 能保证线程安全吗 ? 不能,只保证线程的可见性,不能保证原子性。
DCL(double check Lock)单例为什么要加 volatile? 防止指令重排,指令重排会造成错误数据。(举例指令重排 int i = 8 正常cpu的执行顺序为 1 分配内存 2 对象初始化 3 建立指针对应关系, 加入我们做了相关优化 以节省cpu资源目的 顺序会变成1 3 2 这样会造成数据错误安全问题)
java线程锁机制是怎样的? java的锁 就是在对象的markworld中记录一个锁的状态, 偏向锁、轻量级锁、重量级锁、无锁 就相当锁的每一个状态。
自旋锁 是轻量级锁的一种,
java 的锁机制 就是根据资源竞争的激烈过程中不断升级锁的一个过程。
new 对象处理,判断是否开启偏向锁没如果开启,先加上偏向锁 ,出现资源竞争 就升级为轻量级锁(自旋锁)处于排队等待的状态,为节省cpu资源,降低自旋锁的消耗转由操作系统处理,轻量级锁 升级为 重量级锁;另一种情况当偏向锁线程所执行耗时过长,则直接升级为重量级锁
什么是可重入锁?
谈谈你对AQS的理解?AQS如何实现可重入锁?
AQS是java线程同步的一个框架,
如何让ABC三个线程同时执行?CountDownLatch
如何在并发情况下保证ABC三个线程依次执行? 利用volatile 关键字可以实现