随笔分类 -  Java面经

摘要:语法层面 synchronized是关键字,源码在jvm中,用c++语言实现。 Lock是接口,源码由jdk提供,用Java语言实现。 使用synchronized时,退出同步代码块,锁会自动释放。 使用Lock时,需要手动调用unlock方法释放锁。 功能层面 二者均属于悲观锁,都具备互斥(一个线 阅读全文
posted @ 2022-08-24 15:47 临易 阅读(103) 评论(0) 推荐(0) 编辑
摘要:共同点: wait(),wait(long),sleep(long)的效果都是让当前线程暂时放弃CPU的使用权,进入阻塞状态。 不同点: 方法归属不同 sleep(long)是Thread的静态方法。 wait,wait(long)都是Object的成员方法,每个对象都有。 醒来时机不同 sleep 阅读全文
posted @ 2022-08-24 14:52 临易 阅读(32) 评论(0) 推荐(0) 编辑
摘要:示意图: 1.核心线程数:最多保留的线程数(可以为0) 2.最大线程数:核心线程+救急线程 3.workQuene:阻塞队列,对任务起到缓冲作用。还未进行的线程不会直接成为救急线程,而是先存在任务队列中,等核心线程空闲下来后,会被获取执行。(上限控制) 4.救急队列:当核心线程都在运行,任务队列也都 阅读全文
posted @ 2022-08-24 14:36 临易 阅读(93) 评论(0) 推荐(0) 编辑
摘要:java中的线程状态 线程状态_五种状态vs六种状态 五种状态:操作系统层面 分到CPU时间的:运行 可以分到CPU时间的:就绪 分不到CPU时间的:阻塞 Java中的Runnable涵盖了操作系统中的就绪、运行、阻塞 I/O状态。 阅读全文
posted @ 2022-08-24 11:49 临易 阅读(17) 评论(0) 推荐(0) 编辑
摘要:单例模式的五种实现方式 1.饿汉式 public class Singleton1 implements Serializable { private Singleton1() { if (INSTANCE != null) { throw new RuntimeException("单例对象不能重 阅读全文
posted @ 2022-08-24 10:42 临易 阅读(30) 评论(0) 推荐(0) 编辑
摘要:哈希表 应用场景:快速查找 通过计算元素的哈希码,得到元素的桶下标,计算元素位置。接下来只需要进行少量的比较即可找到元素。 当链表长度过长时,可以通过扩容减少链表长度。但如果元素的原始哈希码都一样时,即使扩容也无法改变链表长度,只能进行红黑树的树化。 底层数据结构,1.7与1.8有何不同? 1.7 阅读全文
posted @ 2022-08-23 09:14 临易 阅读(81) 评论(0) 推荐(0) 编辑
摘要:ArrayList: 1.基于数组,需要连续内存 2.随机访问快(根据下标访问)。(按照内容查询时ArrayList与LinkedList速率基本相同) 3.尾部插入、删除性能好,其他部分插入、删除都会移动数据,因此性能低。 4.可以利用cpu缓存,一定程度上提升读写性能。 (局部性原理:读到一个元 阅读全文
posted @ 2022-08-22 13:41 临易 阅读(15) 评论(0) 推荐(0) 编辑
摘要:1.failFast (ArrayList) 一旦发现遍历的同时其他人来修改,则立即抛异常。 当执行一个遍历时,另一个线程修改了遍历的数据,则会立即抛出ConcurrentModificationException(并发修改异常)。 实现原理:记录了循环开始时的次数,如果在循环的过程中修改次数被改, 阅读全文
posted @ 2022-08-22 11:36 临易 阅读(19) 评论(0) 推荐(0) 编辑
摘要:如果调用无参arrayList构造方法,则初始长度为0; 如果构造带参的构造方法,则初始容量为指定长度。 1.调用add()方法 1.第一次扩容为10(从0到9)。 2.后续扩容都是前一次的1.5倍(创建一个新数组(0-14),将旧数组的元素拷贝到新数组中去,用新数组代替旧数组,旧数组没有被引用,作 阅读全文
posted @ 2022-08-22 10:24 临易 阅读(198) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示