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