面试题总结第二弹

一.Volatile++为什么不保证原子性?

因为它实际上是三个操作组成的一个复合操作。

首先获取volatile变量的值,将该变量的值加1,将该volatile变量的值写会到对应的主存地址。而原子性指的是一个或多个操作在CPU执行的过程中不会被中断的特性,即这些操作要么全部执行,要么全部不执行。Volatile虽然能保证变量的可见性,但它不能保证复合操作的原子性。

二.Hashmap的阈值为什么是0.75?

1.平衡性能和空间利用率

加载因子的选择是一个权衡。较小的加载因子会导致哈希表更快地达到扩容条件,但可能会浪费空间。较大的加载因子会减少扩容的频率,但可能导致更多的冲突。0.75是在效率和空间利用之间取得的平衡,通常能够提供较好的性能。

2.减少冲突的可能性

较小的加载因子意味着哈希表的填充程度相对较低,减少了冲突的可能性。冲突是指两个不同的键映射到了相同的哈希表索引,影响了HashMap的性能。0.75的加载因子在减少冲突的同时,保持了较高的空间利用率。

3.加载因子对性能的影响

加载因子的选择直接影响HashMap的性能。较小的加载因子会使得哈希表更频繁地进行扩容,但在容量增加的同时也降低了冲突的可能性。相反,较大的加载因子会减少扩容的频率,但可能导致较多的冲突,从而影响性能。

三.Hashmap的容量为什么是2的n次幂?

只有数组长度是2的幂次方倍才能够确保数组中的每一个位置发生hash冲突的概率是相同的,数组长度减一的二进制码必须全部是1,否则会出现部分位置永远不会发生hash冲突而造成资源浪费

四.Redis有哪几种数据淘汰策略?

1.noeviction :返回错误当内存限制达到,并且客户端尝试执行会让更多内存被使用的命令。

2.allkeys-lru : 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。

3.volatile-lru : 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。

4.allkeys-random : 回收随机的键使得新添加的数据有空间存放。

5.volatile-random : 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。

6.volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。

五.service里的方法a通过this调用方法b会导致方法b事务传播机制失效吗?

会,事务管理的切面将无法拦截"this"调用,从而导致事务失效

六.Redis 集群模式下一个 Master (主节点)挂掉后如何选举?

当 slave(从节点) 发现自己的 master(主节点) 变为 FAIL(宕机) 状态时,便尝试进行 Failover(即故障切换),以期成为新的 master。由于挂掉的 master 可能会有多个 slave,从而存在多个 slave 竞争成为 master的过程, 其过程如下:

1.slave发现自己的 master 变为 FAIL(宕机)。

2.将自己记录的集群 currentEpoch 加 1,并广播 信息

3.其他节点收到该信息,只有 master 响应,判断请求者的合法性,并发送信息

4.尝试 failover(故障切换) 的 slave 收集 master 返回的信息

5.slave 收到超过半数(N/2+1) master 的 ack 后变成新 Master(这里解释了集群为什么至少需要三个主节点,如果只有两个,当其中一个挂了,只剩一个主节点是不能选举成功的)。

6.slave 广播 消息通知其他集群节点。

从节点并不是在主节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,一定的延迟确保我们等待 FAIL 状态在集群中传播,slave 如果立即尝试选举,其它 masters 或许尚未意识到 FAIL 状态,可能会拒绝投票

七.Redis哨兵模式是什么?它的作用是什么?

Redis哨兵是用于监控和管理Redis集群的进程。它负责监测Redis节点的健康状态,当主节点发生故障时,自动进行故障转移,选举新的主节点,保证Redis集群的高可用性。

八.在Redis主从复制中,如果主节点宕机,会发生什么情况?

如果主节点宕机,从节点会进行选举新的主节点,并进行故障转移。被选为主节点的从节点将成为新的主节点,并继续提供读写服务。

九.redis的key的过期原理

**1. 定时任务:**Redis 定时任务会定期检查过期的key,删除这些过期的key。

2.惰性删除:当一个key被访问时,Redis会检查这个key是否过期,如果过期就删除它。

**3.定期删除:**在Redis的内存回收策略中,还包括了主动清理内存的策略,即定期执行一个清理过期key的操作。

十.redis实现分布式锁原理、特点

分布式锁是分布式系统中的关键概念,用于解决多个节点同时访问共享资源可能引发的并发问题。

为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下五个条件:
1.互斥性: 同一时间只能一个节点获取到锁,其他节点需要等待获取到锁的节点释放了锁才可以获取到锁,而这里的等待一般是通过阻塞,和自旋两种方式

2.安全性: 解铃还须系铃人,只能释放自己的锁不能误删别人的锁

3.死锁: 比如在节点宕机时最容易出现锁没被释放的问题,然后出现死锁,所以做锁的过期

4.容错: 当Redis宕机,客户端仍然可以释放锁

**5.可重入:**获取锁失败可以重新尝试获取锁

相关推荐
从int开始23 分钟前
在过滤器中获取body中的json数据并且使得后续的controller层也能获取使用
java·filter
长勺24 分钟前
Java云原生到底是啥,有哪些技术
java·开发语言·云原生
前端小巷子25 分钟前
CSS渲染性能优化
前端·css·面试·性能优化
找不到、了1 小时前
有关SOA和SpringCloud的区别
java·spring·spring cloud
等等5431 小时前
Java EE初阶——初识多线程
java·开发语言·jvm
星霜旅人1 小时前
Java并发编程
java
天上掉下来个程小白2 小时前
缓存套餐-01.Spring Cache入门案例
java·redis·spring·缓存·springboot·springcache
深色風信子2 小时前
Eclipse 插件开发 6 右键菜单
java·ide·eclipse·右键菜单
网安INF2 小时前
Apache Shiro 1.2.4 反序列化漏洞(CVE-2016-4437)
java·网络安全·apache
it-搬运工2 小时前
远程调用负载均衡LoadBalancer
java·微服务·负载均衡