1.线程安全的集合类
在Java中,一些线程安全的集合类有Stack、Vector、Properties、Hashtable等
2.线程池中execute和submit的区别
1)参数及返回值不同
excute只能提交Runnable,无返回值
submit既可以提交Runnable,返回值为null,也可以提交Callable,返回值Future
2)异常抛出不同
execute执行任务时遇到异常会直接抛出
submit执行任务是遇到异常不会直接抛出,只有在使用Future的get方法获取返回值时才会抛出异常
3.线程池创建的方式
ExecutorService threadPool1 = Executors.newFixedThreadPool(5); //5个窗口
ExecutorService threadPool2 = Executors.newSingleThreadExecutor(); //一个窗口
ExecutorService threadPool3 = Executors.newCachedThreadPool();
//表示延迟一秒,后执行3秒
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
log.info("delay 1 seconds, and excute every 3 seconds");
}
}, 1, 3, TimeUnit.SECONDS);
4.缓存击穿、缓存穿透和缓存雪崩的区别
(1)缓存击穿:热点数据过期,导致大批量查询数据库
解决办法:
1)对热点数据采用永不过期策略,避免缓存击穿。
2)缓存读库加锁
(2)缓存穿透:指当一个查询请求访问一个不存在于缓存中且也不存在于数据库中的数据时,这个请求会无效地继续访问数据库,而不会被缓存。如果黑客故意发送大量非法请求,则缓存层无法起到过滤作用,可能导致数据库负载过大。
解决办法:
1)业务类型校验,屏蔽不合规的KEY
2)布隆过滤器,无法确定是否存在,但可以确定一定不存在
(3)缓存雪崩:指当缓存集中在某个时间点失效或由于某个原因发生故障,导致大量的请求直接打到后端数据库,造成数据库瞬时压力过大,甚至引起数据库崩溃。在缓存雪崩期间,系统性能急剧下降,无法正常提供服务。
解决办法:
1)过期时间打散
2)缓存不过期
5.常用的设计模式
6.架构方面的工作
7.团队管理的经验
8.虚拟机调优的经验
9.大数据调优的方式