https://blog.csdn.net/sheng_q/category_10901984.html?spm=1001.2014.3001.5482
epoll
事件驱动的I/O模型,同时处理大量的文件描述符
内核与用户空间共享一个事件表:监控的文件描述符以它们的状态,当状态变化,内核将事件通知给用户空间,用户空间根事件类型进行相应的处理
epoll_create(内核空间)创建文件描述符epfd
ep_alloc建初始化eventpoll
eventpoll:被监听socket列表rbr(epitem)/等待队列wq/就绪socket列表rdllist(wait方法从其取)
epitem:红黑树rbn/rdllink就绪列表/ffd引用描述符/pwqlist等待队列/eq含当前的eventpoll对象指针/event感兴趣的事件和源fd
anon_inode_getfd把wventpoll映射到文件描述符
epoll_ctl:添加或删除要监听的socket(到epfd)
epoll_wait等待数据
bean实例化与依赖注入
属性注入:javaBean中存在默认构造函数 设置方法
Spring系列-3 Bean实例化与依赖注入_实例化包括属性注入嘛-CSDN博客
循环依赖:提前暴露引用
/**创建好的对象 实例化 属性设置 初始化Cache of singleton objects: bean name to bean instance*/
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);/**半成品对象Cache of early singleton objects: bean name to bean instance. */
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);/**构造bean对象的lambda表达式,bean对象创建工厂Cache of singleton factories: bean name to ObjectFactory.(被代理的)对象 */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
三级缓存作用:
如果需要代理 初始化阶段的aop提前至属性设置阶段,引入this.earlyProxyReferences标志(map)
lambda表达式并执行获取代理对象
二级缓存作用:
第一次通过lambda表达式得到代理对象,将代理对象存入二级缓存并删除三级缓存
第二次直接从二级缓存中查询,而不需要再次执行lambda表达式
inject:
根据beanName等信息获取待注入的值; 通过反射完成属性注入
国际化
Locale类国际化类型,包含国家和地区
准备国际化文件:资源名_语言_国家/地区.properties(只能含ASCII字符)
refresh()的步骤中存在initMessageSource()
springboot 通过spi spring.factories中MessageSourceAutoConfiguration @ConditionalOnMissingBean
JsonDeserializer 自定义
高并发优化:
高并发扣减库存:
提交订单-库存,支付时效,超过自动取消订单 还原库存
token校验/防多次刷单 拉黑/ redis先操作 扣减库存 支付的时候再实际扣减库存
扣减明细 流水 / 缓存扣减 / 扣减库 +MQ
定期检查redis/数据库 一致性; 异步更新缓存canal
https://blog.csdn.net/sheng_q/category_10901984.html?spm=1001.2014.3001.5482
线程池:
corePoolSize:核心
maximumPoolSize 核心+非核心
threadFactory工厂:释放守护/优先级
blockingQueue:
- LinkedBlockingQueue链式阻塞队列Integer.MAX_VALUE,无限创建队列
- ArrayBlockingQueue数组阻塞队列,需要指定队列的⼤⼩
- SynchronousQueue同步队列,内部容量为0,每个put操作必须等待⼀个take操作
- DelayQueue延迟队列,当其指定的延迟时间到了,才能够从队列中获取到该元素
rejectedExecutionHandler拒绝策略:
- AbortPolicy丢弃任务并抛RejectedExecutionException异常
- DiscardPolicy丢弃新来的任务
- DiscardOldestPolicy丢弃队列头部(最旧)任务 重新尝试执⾏程序(如果失败,重复此过程)
- CallerRunsPolicy调⽤线程来处理该任务
newCachedThreadPool 很多短时间的任务时,线程复⽤率⽐较⾼,非核心线程 先入队
0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>()
newFixedThreadPool只创建核⼼线程
nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()
newSingleThreadExecutor
1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()
newScheduledThreadPool定⻓线程池,⽀持定时及周期性任务执⾏
corePoolSize, Integer.MAX_VALUE, DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS, new DelayedWorkQueue()
【多线程】线程池里边都有些什么东西呢_当队列满了,核 线程空闲、扩展线程也空闲,谁从队列 获取?-CSDN博客百度安全验证
ArrayList和LinkedList:
arraylist动态数组,随机访问get/set,指定位置插入 arraycopy耗时
linkedList双向链表,for循环获取元素,index<size/2,左边查 否右边查
数据量大 插入数据 arraylist优势大 特别是后面位置查入
java集合框架05——ArrayList和LinkedList的区别-CSDN博客
Kunbernetes(k8s)的基本概念详解+部署_kuburnetes-CSDN博客
安全验证 - 知乎