- 博客(13)
- 收藏
- 关注
原创 每天一道面试题一多线程
线程实现方法继承Thread类实现Runnable接口线程状态说明初始状态当new一个线程时,此时线程就为初始状态。可运行状态当该对象调用start方法时,线程就进入可运行状态。运行状态当可运行状态线程获取到cpu时间片时,线程就进入运行状态不可运行状态当线程调用自身的sleep方法、其他线程的join方法时,线程此时就进入不可运行状态,也称之为阻塞状态,这个状态下,线程不运行,但是持有的资源也没有被释放,当sleep方法和join方法结束之后,进入可
2022-03-25 21:36:19 647
原创 每天一道面试题一synchronize和lock的区别
存在层次synchronize是关键字,存在于jvm层面上Lock是一个类锁释放synchronize是以获取锁的线程执行完同步代码,释放锁,且当线程执行异常时,jvm会主动让线程释放锁。Lock必须在finally中释放锁,当程序不正常结束容易造成死锁。锁状态synchronize无法判断锁的状态Lock可以判断锁的状态锁类型synchronize为可重入锁、不可中断、非公平锁Lock为可重如锁、可判断、公平锁(非公平也行)性能synchronize适用于少量同
2022-03-24 21:54:08 252
原创 每天一道面试题一mybatis缓存
一级缓存一级缓存默认开启,一级缓存是和SqlSession绑定的,只存在于SQLSession的生命周期中,且任何的修改操作都会清空一级缓存。二级缓存二级缓存可以理解为存在于SqlSessionFactory的生命周期中,需要配置才能生效,且只有当调用SqlSession的close方法后,SqlSession才会保存查询数据到二级缓存中,在这之后才有了缓存数据。配置二级缓存在配置文件中设置cache-enabled为true即可开启二级缓存。开启之后默认如下效果:映射文件中所有查询都
2022-02-27 19:10:42 543
原创 每天一道面试题一缓存穿透、缓存击穿、缓存雪崩
缓存穿透是指查询一个缓存和数据库中都不存在的数据,每次查询都会去查询数据库。解决方案缓存空值,以及一些不存在ID的key,当查询这些值时直接返回null。缓存击穿是指查询缓存中不存在(缓存时间过期),数据库中存在的数据,当请求过来的时候,造成大量请求都直接请求数据库。解决方案热点数据设置永不过期。设置互斥锁,当数据存在于缓存中时,直接返回,当数据不存在于缓存时,第一个请求去数据库拿数据,然后设置缓存,接着后面的请求都直接走缓存拿数据。缓存雪崩是指缓存中同一时间不同缓存数
2022-02-21 19:51:00 375
原创 每天一道面试题一String StringBuilder以及StringBuffer的区别
String使用final char value[]数组实现字符串数组,所以是不可变的。由于使用final关键字,所以相当于常量,线程安全。StringBuilder继承自AbstractStringBuilder,使用char value[]数组实现字符串数组,所以可变。操作数组方法没有使用加锁操作,所以线程不安全。StringBuffer继承自AbstractStringBuilder,使用char value[]数组实现字符串数组,所以可变。操作数组方法都添加了加锁操作,所以
2022-02-20 19:39:09 201
原创 每天一道面试题一HashMap、HashTable以及ConcurrentHashMap的区别
HashMap1.不是线程安全的。2.key和value都可以为null,且为null的key只能存在一个,为null的value可以存在多个。3.初始大小为16,每次扩容都会扩容至原来的2倍。4.底层是数组+链表+红黑树,在链表个数大于8时会转化为红黑树。HashTable1.是线程安全,因为方法加上了synchronize关键字。2.key和value都不能是null的。3.初始化大小为11,每次扩容都会扩容至原来的2倍+1.4.底层是数组加链表,没有红黑树转换。Concur
2022-02-19 11:48:29 404
原创 每天一道面试题一redis中Hash扩容机制
什么是HashRedis 中的 Hash和 Java的 HashMap 更加相似,都是数组+链表的结构.当发生 hash 碰撞时将会把元素追加到链表上.值得注意的是在 Redis 的 Hash 中 value 只能是字符串渐进式 rehash当hash触发rehash时,会新建一个hash表并分配内存,同时维护一个rehashIndex变量,初始化为0,表示rehash开始,然后每次线程对hash进行增删改查操作时,都会把h1中的rehashIndex位置的数据复制到h2中,同时对rehashI
2022-02-16 20:34:05 1575
原创 每天一道面试题一分布式锁实现方式
redis实现分布式锁使用setnx命令,此命令意为如果不存在,则设置值,存在则不会设置值。存在的问题当不设置过期时间时,如果线程获得锁之后死亡就会变成死锁当设置过期时间时,如果线程获得锁之后处理业务时间过长,导致过期时间过期,就会使得锁释放,其他线程拿到了锁,当其处理完业务时,就会去释放其他线程获得的锁,会导致数据问题。解决方法可以使用一个守护线程给锁的过期时间续期,当处理业务时间过长时,当快要到达过期时间,就重置过期时长。缺陷redis最终还是存在当部署多个节点时,可能还是
2022-02-15 21:40:17 520
原创 每天一道面试题一谈谈TCP建立连接和断开连接的过程
简介传输控制协议(Transmission Control Protocol)建立连接(三次握手)第一次握手是客户端发送消息给服务端,服务端接收到客户端发送的消息。第二次握手是服务端回复客户端已经接收到的消息,客户端也接收到服务端回复的消息。第三次握手是客户端回复服务端接收到回复的消息,服务端接收到客户端反馈的结果。Why第一次握手,服务端确认客户端发送消息正常。第二次握手,客户端确认服务端发送接收消息正常。第三次握手,服务端确认客户端接收消息正常。所以,由此三次握手双方都能确
2022-02-14 21:16:01 1340
原创 每天一道面试题一联合索引
概念由两个或两个以上列组合的索引匹配原则最左匹配原则,顾名思义就是从左端的一个字段开始匹配,一个联合索引(a,b,c)其实相当于a a,b a,b,c 三个索引的效果,当查询条件满足该三个索引任意一个时,字段顺序是可以随意调换的;所以 where a=1 and b=1和where b=1 and a=1都会走索引。优点减少开销:上面说到一个联合索引就相当于三个索引的效果,所以,当我们需要这三个索引时就只需要创建一个联合索引即可,这样减少了索引的创建数量,也就减少了数据在修改时的开销
2022-02-13 17:25:31 752
原创 每天一道面试题一synchronize的底层实现以及锁升级过程
作用范围synchronized可以修饰静态方法、修饰实例方法、修饰代码块方法底层原理jvm通过方法常量池中的方法表结构中的ACC_SYNCHRONIZED标志区分是否为同步方法,如果是同步方法,则线程会持有monitor,然后再执行方法,最后执行完(不管是执行正常或者异常)释放monitor代码块底层原理利用monitorenter和monitorexit这两个字节码指令。它们分别位于同步代码块的开始和结束位置。当jvm执行到monitorenter指令时,当前线程试图获取monito
2022-02-12 17:57:05 460
原创 每天一道面试题一B树和B+树的区别
基础B树又叫平衡多路查找树,顾名思义这种数据结构一般用来查找速度比较快,B+树是B树的一种加强树。区别B树的每个节点都存储key和data。B树由于key和data存在同一个节点,无法进行区间查询。B树的查询最好时间复杂度为O(1)。B+树的查询时间复杂度固定为logN。B+树只在叶子节点中存储数据。B+树可以进行区间查询,并且由于非叶子节点没有存储data,所以每一页加载到内存的信息量更大。引申由上区别可以得出为什么数据库中索引的数据结构用B+树,第一点是因为其非叶子节点不存
2022-02-11 19:39:29 1562
原创 每天一道面试题一CAS概念以及实现原理?
每天一道面试题CAS概念以及实现原理?概念全称:Compare and Swap 比较交换原理存在三个变量,一个变量是内存的值,另一个变量是预期值,还有一个变量是修改后的值当一个线程需要修改数据时,首先会从内存中读取数据的值赋值给预期值,然后修改时会比较预期值和内存的值是否相等,如果相等,则修改,否则不修改重复上述操作存在问题ABA问题,一个线程把数据从A改变到B,然后又从B改变到A,值虽然不变,但是存在两次动作并发越高,失败的次数会越多,CAS如果长时间不成功,会极大的增加C
2022-02-09 21:07:04 274
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人