面试题day10
字节跳动
-
自我介绍
-
项目相关
-
Java中常用的集合类
-
有一组数据,需要按照顺序对它进行加密,如果用集合做的话你会选哪个集合?比如一个数组,其元素本身无序,每个元素是字母或者数字都行,对它从小到大进行排序,你会选哪个集合去存储?
linkedhashmap treemap
-
Java中线程同步的方案有哪些
互斥同步(也称为阻塞同步,属于一种悲观的并发策略)
- synchronized、J.U.C包中的锁(锁重入、公平锁\非公平锁)
非阻塞同步(基于冲突检测的乐观并发策略,使用了硬件指令集提供的CAS功能)
- J.U.C包里面的整数原子类
无同步方案(线程本地存储)
- Java中可以通过java.lang.ThreadLocal类来实现线程本地存储的功能
-
Lock接口的实现类
ReentrantLock
ReentrantReadWriteLock
-
MySQL查询比较慢的话,通过什么方式来优化
情况①:偶尔很慢,可能是数据库在查询脏页,或者没拿到锁
情况②:一直很慢,可能是没有索引,或者有索引但没走索引,或者表数据量太大需要分库分表 -
http协议
http是应用层的协议,其传输层协议是tcp,三次握手和四次挥手的完整过程
-
算法题:lc726 原子的数量
便利蜂
-
八种基本类型
float double
byte short int long
char
boolean
-
int取值范围
Byte类缓存范围:[-128,127] 共256个值。
Short类缓存范围:[-128,127] 共256个值。
Character类缓存范围:[0,127] 共128个值。
Integer类默认缓存范围:[-128,127] 共256个值
Long类缓存范围:[-128,127] 共256个值。
Boolean类就缓存两个值:true、false。 -
封装类与封装类,封装类与基本类型比较。
注意Integer在[-128,127]和这个区间之外是有区别的。在这个区间之内,Integer类型是IntegerCache.cache[x],这是一个静态类,所以可以使用==,在这个范围之外是Integer类型是直接new Integer(x)
-
线程安全集合
CopyOnWriteArrayList、CopyOnWriteArraySet
ConcurrentHashMap
hashtable vector
-
hashmap
0.75
过高 hash冲突严重
过低 频繁扩容
-
counrrenthashmap
1.7 分段加锁
1.8 synchronized+cas
-
如果两个同样的put相同的key,会发生什么?
链地址法
-
线程池工作原理
核心线程数 最大线程数 阻塞队列 线程工厂 存活时间 时间单位 拒绝策略
-
为什么要使用线程池
减低资源消耗,提高资源管理
-
线程池中为什么要使用阻塞队列
线程池创建线程需要获取mainlock这个全局锁,影响并发效率,阻塞队列可以很好的缓冲。
如果新任务的到达速率超过了线程池的处理速率,那么新到来的请求将累加起来,这样的话将耗尽资源。
-
为什么用阻塞队列而不是普通队列
阻塞队列主要是用于生产者-消费者模型的情况。比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后,被阻塞的线程会自动被唤醒(不需要我们编写代码去唤醒)。这样提供了极大的方便性。如果使用非阻塞队列,它不会对当前线程产生阻塞,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。
-
线程复用的原理
-
线程池运行中,突然电脑关机了,内存数据都会丢失,开机后怎么办?
消息队列的一些框架的内容,分布式队列
数据库持久化
-
sychronized和reentrantlock
- 原始构成
- Synchronized是关键字属于JVM层面,
monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖monitor对象只有在同步块或方法中才能调wait/notify等方法)
monitorexit - Lock 是具体类(java.util.concurrent.locks.lock)是api层面的锁
- Synchronized是关键字属于JVM层面,
- 使用方法
- Synchronized 不需要用户手动释放锁,当synchronized代码执行完成后系统会自动让线程释放对锁的占用
- Reentrantlock则需要用户去手动释放锁若没有主动释放锁,就有可能导致出现死锁的现象。
需要lock()和unlock()方法配合try/finally语句块来完成
- 等待是否可中断
- synchronized不可中断,除非抛出异常或者正常运行完成。
- Reentrantlock 可中断,
- 设置超时方法。tryLock(Long timeout,TimeUnit unit)
- lockInterruptibly()放代码块中,调用interruptibly()方法可中断。
- 加锁是否公平
- synchronized非公平锁
- Reentrantlock俩者都可以,默认非公平锁,构造方法可以传入boolean值,true为公平锁,false为非公平锁。
- 锁绑定多个条件Condition
- synchronized没有
- Reentrantlock用来实现分组唤醒需要唤醒的线程们,可以精确唤醒,不像synchronized随机唤醒或者唤醒全部线程。
- 原始构成
-
hashset和hashmap
hashset则将对象存储在map的key中,value值用一个new Object()作为填充
-
sychronized锁优化
自旋锁、偏向锁、轻量级锁、重量级锁
-
复合索引最左匹配,以及从源码上讲为什么要最左匹配
-
如果使用delete删除,是真的把这个记录删除了吗?
mysql执行delete操作后,存储在硬盘上的数据没有被删除,只不过在记录行上做了逻辑删除,即通过删除标识位实现。
uodo log
-
一个字段要求存的是不带符号的int,那怎么存负数?
自制符号位
-
自增id为什么会用完,用完了怎么办?
-
如果数据库有100条值,数据库引擎会使用索引搜索吗?
不一定,看执行计划
-
like语句什么时候能用什么时候不能用?
违背最左前缀原则
select *
索引列上有计算
索引列使用函数
索引字段类型不同
like左边包含%
or关键字未全部使用索引
not in和not exists