面试题

0. nacos服务端和客户端心跳保持默认是多少? 答: 服务端是5秒,客户端是10秒 

 

1.如果在Spring中动态切换数据源呢?

  具体的实现类围绕着Spring中jdbc提供的 AbstractRoutingDataSource

2.Spring中如何管理事务的,事务失效的一些问题,实现类里的A方法调用B方法  B方法有事务 A方法没有事务,这时B方法里面报错A方法会回滚吗?B方法会回滚吗?

3.CAP 定理?  CP 和AP实现的原理?

答:使用一致性协议,例如nacos采用的是Raft,并且要有一个Leader

  Raft是一种分布式一致性算法,被设计用来解决分布式系统中的一致性问题。它由Diego Ongaro和John Ousterhout于2013年提出,并且相对于其他一致性算法(如Paxos),Raft更容易理解和实现。

  Raft算法通过选举一个领导者(Leader)来管理整个集群,其他节点则作为跟随者(Follower)或候选人(Candidate)。在正常情况下,领导者负责接收客户端请求并复制日志条目到其他节点。当领导者无法正常工作时,其他节点会发起新一轮的选举来选取新的领导者。

  Raft算法的关键概念包括:

    1.   领导选举(Leader Election):在初始阶段或者当前领导者无法正常工作时,节点会发起选举来选择新的领导者。选举过程包括候选人的提名、投票和胜出条件等。

    2.   日志复制(Log Replication):领导者负责接收客户端请求,并将请求转化为日志条目进行复制。一旦大多数节点确认复制成功,该日志条目被视为已提交,并且可以应用到状态机中。

    3.   安全性(Safety):Raft算法通过使用随机超时来防止选举冲突和网络分区问题。此外,算法确保只有具有最新日志条目的节点可以成为领导者。

  Raft算法的设计目标是易于理解和实现,使得分布式系统的开发更加简化。它在很多分布式系统中得到了广泛应用,如Consul、etcd等。

 

4.很长的一堆字符串里面 去寻找一个字符串?

5.如何让bool Filter 更精准一些呢? boolFilter存在hash碰撞,然而它说没有就一定没有,它说有有可能有,

6.数据库组合索引  A B C  顺序查找 ABC 一定会命中索引,那么 B C 会命中索引吗?

7.聊聊CAS 和AQS   什么是公平锁? 什么是重入锁呢

8.有没有用过Redis去做排行榜?Redis里面的存储结构有那些?

9.MySQl客观锁,悲观锁,for update 锁行还是锁表

10. 有一张表,其中员工和商户的关系是N:1,按照商户维度去查询员工信息,要求 每个商户只显示一条记录,而员工的姓名按照 最先添加的排成一列显示出来,

11. 有一张表其中一列为状态  值 1,2,3,4,5,6,7,8,9,现在我想用sql编写显示  123 归类A456归类B 789归类C 如何完成?

12. MySql的引擎有哪些? 索引有那些?

13.MySql为什么没有用BTree而是用B+Tree呢?

14.用过那些分布式组件呢? 再用分布式组件的时候遇到过那些问题。分布式事务失效?如何集成skuWalking呢?在集成的时候Agent是什么?

15.MySQl有那些日志呢?

16.用过那些设计模式?

17.int和Integer的区别?

18.你来设计一个秒杀框架?

19 你说一下Object.wait方法?

20.注册中心的访问协议?

21.当涉及到Java线程的面试题时,以下是一些常见的问题和相关知识点:

  1. 什么是线程? 线程是操作系统调度的最小执行单元,它是进程中的一个执行路径。与进程相比,线程更轻量级,可以共享进程的资源,多个线程可以同时执行。

  2. 线程的创建方式有哪些? Java中创建线程的方式有两种:继承Thread类和实现Runnable接口。继承Thread类需要重写run()方法,实现Runnable接口需要实现run()方法,并将其作为参数传递给Thread类的构造函数。

  3. 线程的状态有哪些? 线程具有多个状态,包括新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)等。

  4. 如何实现线程同步? 在多线程环境下,可能会出现资源竞争的情况,为了确保线程安全,可以使用synchronized关键字或Lock接口实现线程同步。这样可以保证在同一时间只有一个线程可以访问共享资源。

  5. 什么是线程安全? 线程安全指的是多线程环境下,对共享数据进行操作时不会出现数据不一致或不可预期的结果。要实现线程安全,可以使用同步机制(如synchronized、Lock)或使用线程安全的数据结构。

  6. 什么是线程池? 线程池是一种管理和复用线程的机制,它可以避免频繁创建和销毁线程的开销。通过线程池,可以对线程进行统一的管理、调度和监控,提高系统性能和资源利用率。

  7. 什么是线程死锁? 线程死锁指的是两个或多个线程在互相等待对方释放资源而无法继续执行的状态。死锁通常发生在多个线程同时持有对方需要的资源,并且无法主动释放资源。

  8. 什么是线程间的通信? 线程间通信是指多个线程之间通过共享内存或消息传递等方式进行信息交换和协调。常用的线程通信机制包括wait()、notify()、notifyAll()等方法,以及使用阻塞队列等数据结构。

这些问题只是Java线程面试中的一部分,面试官可能会根据具体情况提出更深入的问题。熟悉这些基本概念和原理,并能够结合实际场景进行分析和解决问题,将有助于在Java线程的面试中获得更好的表现。

 

wait()、notify()和notifyAll()是Java中Object类的三个方法,用于实现线程的等待和通知机制,常用于线程间的协调和同步操作。

  1. wait()方法:wait()方法使当前线程进入等待状态,直到其他线程调用相同对象上的notify()或notifyAll()方法来唤醒它。线程在调用wait()方法前必须先获得该对象的锁(即在synchronized代码块或方法中调用),否则会抛出IllegalMonitorStateException异常。调用wait()方法后,当前线程会释放该对象的锁,然后进入等待状态,直到其他线程通过notify()或notifyAll()来唤醒它。

  2. notify()方法:notify()方法唤醒在相同对象上调用wait()方法而进入等待状态的一个线程。如果有多个线程等待,但只有一个线程会被随机选择唤醒。notify()方法也要求在synchronized代码块或方法中调用,并且只能在当前线程拥有对象锁时调用,否则也会抛出IllegalMonitorStateException异常。调用notify()方法后,它会通知一个正在等待的线程,并将其从等待队列移到同步队列中,以便于获取锁并继续执行。

  3. notifyAll()方法:notifyAll()方法唤醒在相同对象上调用wait()方法而进入等待状态的所有线程。与notify()方法不同,notifyAll()会唤醒所有等待的线程,让它们都有机会竞争获取锁并继续执行。同样,notifyAll()方法也要求在synchronized代码块或方法中调用,并且只能在当前线程拥有对象锁时调用。

wait()、notify()和notifyAll()方法通常与synchronized关键字一起使用,以实现线程间的等待和通知。通过这些方法,可以实现线程间的协调和同步,避免资源竞争和提高程序的可靠性。需要注意的是,wait()、notify()和notifyAll()方法只能用于在同一个对象上进行线程间的等待和通知,不同对象之间的等待和通知无法实现。

wait()、notify()和notifyAll()方法必须在synchronized块或方法内部调用。这是因为这些方法与对象的监视器(monitor)密切相关,而synchronized关键字用于获取对象的监视器,从而确保线程之间的互斥访问和同步操作。

在Java中,每个对象都有一个内部的锁(即监视器),线程在进入synchronized块或方法时会尝试获取该对象的锁,如果获取成功,就可以执行synchronized块或方法内的操作;如果获取失败,则会被阻塞,直到获取到锁为止。wait()、notify()和notifyAll()方法需要依赖这个内部的锁来实现线程的等待和通知机制,因此必须在synchronized块或方法中使用,以确保对应对象的监视器能够正确地被获取和释放。

另外,wait()、notify()和notifyAll()方法也只能作用于使用同一把锁的线程之间,因为它们是基于对象级别的等待和通知机制。如果在不同的锁上调用这些方法,是无法实现线程间的正确等待和通知的。

因此,为了正确地使用wait()、notify()和notifyAll()方法,确保其能够有效地实现线程间的协调和同步,必须在synchronized块或方法内部进行调用,并且要明确对象锁的范围和所有线程的共享对象。

 wait()、notify()和notifyAll() 只能在一个对象身上使用才管用

posted @ 2022-06-10 14:45  郎小乐  阅读(21)  评论(0编辑  收藏  举报