面试题目
猿码YM
这个作者很懒,什么都没留下…
展开
-
java后端常见面试题
List、Map、Set三个接口,存取元素时,各有什么特点?list元素可以重复,有序存储,set集合元素不允许重复,map用来存放键值对为什么重写equals方法,就要重写hashCode方法先看看object默认的equals方法public boolean equals(Object obj) { return (this == obj); }默认的equals直接比较的是内存地址,我们想要的效果是类的某些属性相等,这样就需要重写equals方法在hash..原创 2022-02-13 12:39:12 · 822 阅读 · 0 评论 -
java线程池总结
为什么要使用线程池方便统一管理和控制线程减少创建和销毁线程的开销线程池参数核心线程数:线程池长期活跃的线程数,不会被回收的线程最大线程数:线程池允许创建的最大线程数空闲线程回收时间:超出核心线程数的线程回收时间时间单位线程池任务队列:核心线程被使用完后任务先放到任务队列待消费,最好是设置有界队列,避免出现任务无限堆积,造成内存溢出的bug任务拒绝策略:当任务队列满了,最大线程数也被使用完后,处理任务的策略池化思想:数据库连接池,http连接池,线程池在实际项目中许多地..原创 2022-01-27 18:07:34 · 337 阅读 · 0 评论 -
ConcurrentHashMap原理
如何保证线程安全:判断数组元素中是否存在key,如果不存在插入一个新的元素,通过cas的方式插入,避免了key被覆盖的情况通过synchronized关键字锁住一个元素,然后操作链表或者红黑树原创 2022-01-26 20:24:56 · 256 阅读 · 0 评论 -
jvm垃圾回收总结
垃圾回收器多种多样,但是都是基于三种垃圾回收算法来实现的标记——清除法:会引起内存碎片化问题标记——复制法:会造成内存使用率不高的缺点,java8新生代就是使用这种回收算法标记——整理法:也需要移动内存,java8老生代使用此方法jdk8使用的时候并行垃圾收集器java8垃圾收集器注重的是jvm的吞吐量java8垃圾收集器有自动分配新生代和老生代内存使用比例的功能,相当于是智能优化...原创 2022-01-16 00:24:23 · 108 阅读 · 0 评论 -
hashmap实现原理
hashmap通过数组和链表来实现的,首先通过计算key的hash值找到数组对应元素,判断当前数组下标位置是否有元素,如果没有就直接插入当前下标位置如果已经存在元素,就需要以链表的形式插入元素hashmap并不是线程安全的数据结构,多线程访问的时候会出现,value被覆盖的情况ConcurrentHashMap可以保证线程安全,hashmap通过synchronized关键字锁住当前数组元素,然后再进行链表的插入为了避免链表过大造成查询变慢,当链表超过元素超过8的时候,链表会成长为红黑树...原创 2022-01-14 14:44:11 · 121 阅读 · 0 评论 -
java单例模式——双重检查
public class Singleton { private volatile static Singleton singleton; public static Singleton getSingleton() { if (singleton == null) { // 这里方法是static的,所以synchronized不能锁住this对象 // 只能锁住class对象 synchroniz原创 2022-01-14 13:44:06 · 511 阅读 · 3 评论 -
java lock锁实现原理总结
lock是jdk层面的锁lock通过双向链表存储等待锁的线程lock通过cas和自旋的方式等待锁的获取原创 2022-01-14 01:01:35 · 1026 阅读 · 0 评论 -
java锁的优化
自旋:jvm智能判断是否需要将当前线程挂起,如果等待很短的时间就可以获取到锁,就没有必要挂起线程因为挂起线程需要切换到内核空间,线程切换有性能的消耗锁删除:jvm自动识别出有些锁不会出现竞争行为,那就取消锁行为轻量级锁:通过cas方式判断是否需要加锁偏向锁:没有线程竞争的时候使用偏向锁...原创 2022-01-14 00:56:19 · 120 阅读 · 0 评论 -
volatile关键字总结
volatile只能保证线程的可见性和有序性,不能保证的线程的原子性,所以还是存在线程不安全的情况出现为什么不能保证原子性:因为volatile只是刷新了工作内存和主内存之间的数据,保证了两者之间的数据一致性并不像synchronized关键字是对一段代码进行了加锁处理理解了工作内存和主内存之间的数据读写操作,也就理解了volatile关键字的原理volatile的使用场景需要满足以下两个条件:变量只被一个线程修改当前变量的修改不需要依赖其他变量...原创 2022-01-13 22:20:30 · 113 阅读 · 0 评论 -
synchronized关键字和volatile的区别
syn关键字是从虚拟机指令的层面来锁定一段代码,同一时间只有一个线程操作,会引起线程挂起volatile关键字不会引起线程的挂起,每次都是刷新工作内存和主内存中的数据,这样就保证了多线程之间的可见性在满足使用场景的情况下优先使用volatile来修饰变量,因为volatile属于轻量级锁,可以减少线程切换的开销...原创 2022-01-13 21:57:58 · 279 阅读 · 0 评论 -
java工作内存和主内存
cpu从物理内存读取数据的速度远不如cpu的计算速度,为了提高cpu的使用效率,需要在cpu和物理内存之间加入cpu缓存cpu从高速缓存中读写数据,再刷新到物理内存在jvm中线程独有的内存区域为虚拟机栈,程序计数器,本地方法栈同时缓存也导致了线程不安全的问题出现,依法了多线程可见性问题总结:6. 主内存对应物理内存,对应到jvm就是堆内存7. 工作内存对应cpu高速缓存,对应jvm的虚拟机栈...原创 2022-01-13 21:42:28 · 1015 阅读 · 0 评论 -
java synchronized关键字
synchronized关键字是重量级锁,线程遇到重量级锁的时候,线程挂起,有用户态切到和核心态,这种切换是一件消耗性能的事情lock和此关键字的区别,lock是jdk语言层面的机制,关键字是虚拟机内置的实现方式,syn经过不同版本迭代,已经做了很多优化,因此推荐优先使用synlock和原来的syn相比主要是实现了可中断,可重入的特性syn主要是通过对象的monitorenter和monitorexit实现了加锁机制jvm提供了锁的特性,方便用户编写出线程安全的程序lock的实现原理是通过一个队.原创 2022-01-12 23:40:44 · 177 阅读 · 0 评论 -
双亲委派模型
实现原理:类加载的时候先通过父类加载器进行加载,只有父类加载不了的时候才通过子类加载;通过查看源码,发现是通过递归方式实现的。打破双亲委派模型的场景:jdbc打破了双亲委派模型,jdk只是定义了接口方法,具体实现由不同的数据库厂商实现不同的驱动。...原创 2022-01-12 23:16:26 · 192 阅读 · 0 评论 -
jvm内存划分
堆:所有创建的对象都放到了这个区域,这个区域还保存了字符串常量方法区:保存了加载的类信息,常量池,静态变量虚拟机栈:线程方法执行的时候生成一个栈帧,栈帧就放到了虚拟机栈当中本地方法栈:jdk自带一些方法调用,不局限于java语言,也可能是其他的语言实现的方法,比如:C语言程序计数器:记录当前线程执行到什么位置,方便线程切换回来的时候继续执行元数据空间:java1.8之后取消了方法区,原来的方法区直接放到了本地内存,避免了出现内存溢出的情况出现本地内存:nio可以分配本地内存,本地内存的大小受机.原创 2022-01-12 22:21:03 · 164 阅读 · 0 评论