网站免费网站免费陪玩,商标起名生成器,佛山做网站公司哪家好,网站改版 内容1.java常用集合
ArrayList动态数组#xff0c;动态调整大小#xff0c;实现List接口 LinkedList双向链表#xff0c;实现list和queue接口#xff0c;适用于频繁插入和删除操作 HashSet无序#xff0c;使用哈希表实现 TreeSet有序#xff0c;使用红黑树实现 HashMap无序动态调整大小实现List接口 LinkedList双向链表实现list和queue接口适用于频繁插入和删除操作 HashSet无序使用哈希表实现 TreeSet有序使用红黑树实现 HashMap无序使用哈希表 TreeMap有序使用红黑树 LinkedHashMap有序使用哈希表和双向链表保持插入顺序 Queue队列 PriorityQueue优先队列按照优先级排序 Stack栈后进先出
2.红黑树相比b树的区别和使用场景
应用场景java集合中的TreeSet和TreeMapHashMap链表大于8转化红黑树cpp的stl中的set和maplinux虚拟内存的管理 红黑树相比b树的优点rbt用于内部排序而bt用于外存是一个磁盘友好的数据结构红黑树具有较快的插入删除查找的时间复杂度
3.ArrayList和LinkedList对比
1.ArrayList是动态数组LinkedList是链表 2.随机访问array快linked增加删除快 3.arraylist需要手动设置固定大小link自由度动态变化 4.arraylist扩容到1.5倍
4.ArrayList使用注意事项
1.线程不安全问题1两个线程同时添加元素判断ensureCapacity都成功导致数组越界 2.线程不安全问题2元素值覆盖为空问题多线程同时写入 安全处理synchronizedList给add加锁copyonwirteArrayList写时复制使用ThreadLocal确保线程封闭性
5.java线程池核心参数
corePoolSize核心线程数没有任务时线程池的基本大小 maximunPoolSize线程池最大的线程数量 keepAliveTime大于core时多余的空闲线程在等待时期最长存活时间 unitkeepAliveTime时间单位 workQueue存放待执行任务的阻塞队列 threadFactory创建新线程的工厂类 handler当线程池到达最大线程数量且任务队列已满常见策略有抛出一场、丢弃任务、丢弃最老任务、直接在调用者线程个中执行
6.线程池工作原理 1.小于core直接创建并执行在核心线程池 2.大于等于core加入队列等待 3.queue满创建非核心线程并立刻执行 4.queue满大于等于maxhandler处理 5.任务执行完移除同时取下一个线程 6.空闲时间超过alivetime且大于core会停止回收多出来的线程
7.为什么要用阻塞队列
1.协调和控制线程执行防止任务丢失或积压 2.任务缓冲确保不会立即执行有效平衡任务的生产和消费速度 3.线程管理当线程池线程忙碌时新任务在队列中等待
如果使用非阻塞队列会产生 1.线程数不受控制耗尽资源 2.任务丢失如果队列已满新任务立刻丢弃 3.竞态条件可能会导致数据一致性问题
8.hashMap的rehash
每个键的hashCode处以桶数组大小lenrehash的意思就是len变大但是还是均匀的
9.CPU密集时如何设计线程池
采用cpu核数1个线程1保证发生缺页中断阻塞时额外的线程可以顶上去 最理想cpu所有的核心都在运行线程池中的线程
10.io密集如何设计线程池
最佳线程数 1 io耗时/cpu耗时从而提高cpu和io的利用率
11.threadlocal原理和使用场景
指线程本地变量使得每个变量副本对于每一个 线程都是独立的实现变量隔离性。 每个线程都有一个成员变量threadlocalmap可以用来存数据 使用场景 1.全局存储用户信息 2.进行线程隔离的变量使用threadlocal进行封装 3.多个方法使用同一个对象时使用threadlocal替代参数的传递减少代码耦合例如transaction中的就使用了threadlocal保存了connection
12.threadlocal使用注意
内存泄漏问题指程序中动态分配的堆内存由于某种原因没有释放或无法释放造成内存浪费导致系统崩溃最后堆积导致内存溢出。
由于entry对象被弱引用修饰会在下次垃圾回收中清除掉实现threadlocal和线程生命周期的解绑 这个时候entry的key是null但是threadlocalmap中存在current thread ref强引用因此value无法清楚。
因此需要我们手动remove掉entry对象。
使用弱引用的原因是因为在set和getEntry过程中会对key进行判断如果key是nullvalue也会设置为null这样即使忘了调用remove当threadlocal被销毁value值也会被清空
ThreadLocal中一个设计亮点是ThreadLocalMap中的Entry结构的Key用到了弱引用。试想如果使用强引用等于ThreadLocalMap中的所有数据都是与Thread的生命周期绑定这样很容易出现因为大量线程持续活跃导致的内存泄漏。使用了弱引用的话JVM触发GC回收弱引用后ThreadLocal在下一次调用get()、set()、remove()方法就可以删除那些ThreadLocalMap中Key为null的值起到了惰性删除释放内存的作用。
其次就是在ThreadLocalMap会存在相应的遍历来查看key为null的槽位并且进行删除哦~