10.线程池的关闭方式有几种,各自的区别是什么?
Shutdown shutdownNow tryTeminate 清空工作队列,终止线程池中各个线程,销毁线程池。
11.假如有一个第三方接口,有很多线程去调用获取数据,现在规定每秒钟最多有10个线程同时调用它,如何做到
ScheduledThreadPoolExecutor 设置定时,进行调度。

public ScheduledThreadPoolExecutor(int corePoolSize,
 ThreadFactory threadFactory) {
 super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,
 new DelayedWorkQueue(), threadFactory);
 }


12.spring的controller是单例还是多例,怎么保证并发的安全
单例,通过单例工厂DefaultSingletonBeanRegistry实现单例,通过保AsyncTaskExecutor保持安全
13:ThreadLocal用过么,用途是什么原理是什么,用的时候要注意什么?
Threadlocal底层是通过threadlocalMap进行存储键值 每个ThreadLocal类创建一个Map,然后用线程的ID作为Map的key,实例对象作为Map的value,这样就能达到各个线程的值隔离的效果。 ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。
14:mysql有哪些存储引擎
MyISAM: 拥有较高的插入,查询速度,但不支持事务
InnoDB :5.5版本后Mysql的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定
BDB: 源自Berkeley DB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性
Memory :所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失
Merge :将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用
Archive :非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差
Federated: 将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用
Cluster/NDB :高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用
CSV: 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个.CSV文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV存储引擎不支持索引。
BlackHole :黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继
15:高并发下,如何做到安全的修改同一行数据
使用悲观锁,悲观锁本质是当前只有一个线程执行操作,结束了唤醒其他线程进行处理。也可以缓存队列中锁定主键。
16:如何写 sql 能够有效的使用到复合索引
由于复合索引的组合索引,类似多个木板拼接在一起,如果中间断了就无法用了,所以要能用到复合索引,首先开头(第一列)要用上,比如index(a,b)这种,我们可以select table tname where a=XX 用到第一列索引 如果想用第二列 可以 and b=XX 或者and b like‘TTT%’
17:MQ系统的数据如何保证不丢失
基本都是对数据进行持久化,多盘存储
18“Redis的数据结构有哪些
字符串(strings):存储整数(比如计数器)和字符串,有些公司也用来存储json/pb等序列化数据,并不推荐,浪费内存
哈希表(hashes):存储配置,对象(比如用户、商品),优点是可以存取部分key,对于经常变化的或者部分key要求atom操作的适合
列表(lists):可以用来存最新用户动态,时间轴,优点是有序,确定是元素可重复,不去重
集合(sets):无序,唯一,对于要求严格唯一性的可以使用
有序集合(sorted sets):集合的有序版,很好用,对于排名之类的复杂场景可以考虑
19:Redis的并发竞争问题如何解决,了解Redis的CAS操作吗?
Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接不存在竞争,但是在jedis客户端对Redis进行并发访问时会发生连接超时,数据转换错误,阻塞,客户端关闭连接问题,这些问题均是由于客户端连接混乱造成的,对此有两种方式
1:客户端角度,为保证每个客户端间正常有序与Redis进行通信,对连接进行池化,同时对客户端读写Redis操作采用内部所Synchronized
2:服务器角度,利用setnx实现锁
MULTI,EXEC,DISCARD,WATCH 四个命令是 Redis 事务的四个基础命令。其中:
MULTI,告诉 Redis 服务器开启一个事务。注意,只是开启,而不是执行 EXEC,告诉 Redis 开始执行事务 DISCARD,告诉 Redis 取消事务 WATCH,监视某一个键值对,它的作用是在事务执行之前如果监视的键值被修改,事务会被取消。 可以利用watch实现cas乐观锁