本文已参与「新人创作礼」活动,一起开启掘金创作之路。
多线程:
1.线程池创建过程
1、单一线程池(始终只有一个线程)
2、定时线程池(在固定时间段内使用线程)
3、定长线程池(自定义设置线程大小 一般使用)
4、可缓存线程池(无限制的线程大小)
最常用的线程池实现类是ThreadPoolExecutor
2.拒绝策略 阻塞队列哪几种 区别
1、使用线程解决
2、直接拒绝不抛异常
3、直接拒绝抛出异常(默认)
4、将最早的线程舍弃,将最新线程添加
阻塞队列:
-
ArrayBlockingQueue(基于数组的先进先出队列,有界)
底层:静态数组,容量固定,没有扩容机制(不像ArrayList是动态数组),如果数组下标上没有内容就会有null填充。用的是同一把锁
-
LinkedBlockingQueue(基于链表的先进先出队列,无界)
链表阻塞队列容量特别大,我们一般认为他是不会满的,然后在效率上 链表阻塞队列要比数组阻塞队列更快,它的生产者和消费者是使用两把锁,而数组阻塞队列生产者和消费者共用一把锁
-
SynchronousQueue(同步队列,无缓冲的等待队列,无界)
线程数可以无限扩展,所以他并不需要一个任务队列来存储任务,因为一旦有任务被提交就直接转发给线程或者创建新线程来执行,而不需要另外保存它们。
-
DelayedWorkQueue(延迟工作队列)
可以一定时间后执行任务或是每隔一定的时间执行一次任务。队列内部元素并不是按照放入的时间排序,而是会按照延迟的时间长短对任务进行排序,内部采用的是“堆”的数据结构。
3.关闭线程池 shutdown shutdown now()区别
调用线程池的shutdown或shutdownNow方法来关闭线程池。
shutdownNow首先将线程池的状态设置成 STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表,而 shutdown只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程。
4.原子类 原子工具
锁:
5.synchronized锁升级过程
整个升级过程分为三种锁:偏向锁、轻量级锁(自旋锁)、重量级锁
首先,synchronized 会尝试使用偏向锁的方式去竞争锁资源,如果能够竞争到偏向锁,表示加锁成功直接返回。如果竞争锁失败,说明当前锁已经偏向了其他线程。
这时候需要将锁升级到轻量级锁(自旋锁),在轻量级锁状态下,竞争锁的线程根据自适应自旋次数去尝试抢占锁资源,如果在轻量级锁状态下还是没有竞争到锁,就只能升级到重量级锁,在重量级锁状态下,没有竞争到锁的线程就会被阻塞, 线程状态是 Blocked。处于锁等待状态的线程需要等待获得锁的线程来触发唤醒。
6.升级到轻量级后,怎么完成锁和线程的绑定
7.spring单体事务传播行为 传播属性
8.transaction底层常用参数
| 参数 | 说明 |
|---|---|
| readOnly | 该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true) |
| rollbackFor | 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class}) |
| rollbackForClassName | 该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:指定单一异常类名称:@Transactional(rollbackForClassName="RuntimeException")指定多个异常类名称:@Transactional(rollbackForClassName={"RuntimeException","Exception"}) |
| noRollbackFor | 该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class}) |
| noRollbackForClassName | 该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:指定单一异常类名称:@Transactional(noRollbackForClassName="RuntimeException")指定多个异常类名称:@Transactional(noRollbackForClassName={"RuntimeException","Exception"}) |
| propagation | 该属性用于设置事务的传播行为,具体取值可参考表6-7。例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true) |
| isolation | 该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置 |
| timeout | 该属性用于设置事务的超时秒数,默认值为-1表示永不超时 |
MySQL:
9.怎么建索引
10.索引有几种
五种
全文索引,组合索引,主键索引,唯一索引,普通索引