JAVA面试题
JAVA面试题
Java基础
HashMap的线程不安全主要体现在下面两个方面:
1.在JDK1.7中,当并发执行扩容操作时会造成环形链和数据丢失的情况。
2.在JDK1.8中,在并发执行put操作时会发生数据覆盖的情况。
volatile为什么是线程不安全的?
volatile修饰的变量在各个线程的工作内存中不存在一致性的问题,但是java的运算并非原子性的操作,导致volatile在并发下并非是线程安全的。
String、StringBuffer、Stringbuilder有什么区别
StringBuilder和StringBuffer非常类似,均代表可变的字符序列,而且方法也一样
String:不可变字符序列,效率低,但是复用率高。
StringBuffer:可变字符序列、效率较高(增删)、线程安全
StringBuilder:可变字符序列、效率最高、线程不安全
MySql
主键和唯一索引区别的:
①.主键是一种约束,唯一索引是一种索引;
②.一张表只能有一个主键,但可以创建多个唯一索引;
③.主键创建后一定包含一个唯一索引,唯一索引并一定是主键;
④.主键不能为null,唯一索引可以为null;
⑤.主键可以做为外键,唯一索引不行;
事务的基本特性和隔离级别
事务基本特性ACID分别是:
原子性指的是一个事务中的操作要么全部成功,要么全部失败。
一致性指的是数据库总是从一个一致性的状态转换到另外一个一致性的状态。
隔离性指的是一个事务的修改在最终提交前,对其他事务是不可见的。
持久性指的是一旦事务提交,所做的修改就会永久保存到数据库中。
隔离性有4个隔离级别:
read uncommit 读未提交,可能会读到其他事务未提交的数据,也叫做脏读。
read commit 读已提交,两次读取结果不一致,叫做不可重复读。不可重复读解决了脏读的问题,他只会读取已经提交的事务。
repeatable read 可重复复读,这是mysql的默认级别,就是每次读取结果都一样,但是有可能产生幻读。可重复读重点在于update和delete,而幻读的重点在于insert。
serializable 串行,一般是不会使用的,他会给每一行读取的数据加锁,会导致大量超时和锁竞争的问题
redis
Redis如何与数据库保持双写一致性
共有四种同步策略:
保证双写一致性共有四种方案:
1,先更新缓存,在更新数据库,该方式的优点是能够保证数据访问是都会命中redis,降低数据库压力。缺点是每次修改都会操作缓存降低了服务器的性能。
2,先更新数据库,再更新缓存:缺点是可能导致数据库和redis中的数据不一致(数据库更新成功,redis更新失败)。
3,先删除redis,再更新数据库。缺点:可能导致数据库和redis中的数据都是旧数据(删除redis后,再更新数据时失败了)
4,先更新数据库再删除redis。缺点:可能导致数据库和redis的数据不一致(redis删除失败)。出错时使用重试机制异步重新处理。
所以我们得到结论:先更新数据库、再删除缓存是影响更小的方案。如果第二步出现失败的情况,则可以采用重试机制解决问题。
redis的高可用性保障措施
增加副本的冗余量。redis提供了主从库模式,保证数据副本的一致性,主从库采用的是读写分离的方式。
redis的主从库模式:
读操作:主库和从库都可以接受请求
写操作:首先主库进行写操作,然后主库将写操作同步到从库。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本