叮当快药

2021-06-27  本文已影响0人  wuhuaguo丶

一轮

常用4种限流算法介绍及比较
面试官:你知道的限流算法有哪些?

拓展:Hystrix的原理和使用

自动提交可以发生的问题

ZK数据同步方式



在初始化阶段,zk 的 learner会优先初始化以全量同步方式来同步数据
learner先向leader注册,上报peerLastZxid

zk是CP系统
不能保证可用性 也就是在极端环境下,ZooKeeper可能会丢弃一些请求,消费者程序需要重新请求才能获得结果

zk初始化选举和崩溃选举
2

在Java中,我们的垃圾回收机制回收垃圾的时候就会根据对象的引用,判断对象是否可以被垃圾回收,这里有两种:

  1. 引用计数法:为每个对象添加一个引用计数器,每当有一个引用指向它时,计数器就加一,当引用失效时,计数器减一,当计数器为0时,则认为该对象可以被回收。
  2. 可达性分析算法(GC roots)从一个被称为GC roots的对象开始往下搜索,如果一个对象到GC roots没有任何引用链相连,则说明此对象不可用。

对象的引用被划分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

二轮

key是ThreadLocal类的实例对象,value为用户的值

wait()方法的作用是将当前运行的线程挂起(即让其进入阻塞状态),直到notify或notifyAll方法来唤醒线程.

有了对wait方法原理的理解,notify方法和notifyAll方法就很容易理解了。既然wait方式是通过对象的monitor对象来实现的,所以只要在同一对象上去调用notify/notifyAll方法,就可以唤醒对应对象monitor上等待的线程了。notify和notifyAll的区别在于前者只能唤醒monitor上的一个线程,对其他线程没有影响,而notifyAll则唤醒所有的线程

sleep方法的作用是让当前线程暂停指定的时间(毫秒),sleep方法是最简单的方法,在上述的例子中也用到过,比较容易理解。唯一需要注意的是其与wait方法的区别。最简单的区别是,wait方法依赖于同步,而sleep方法可以直接调用。而更深层次的区别在于sleep方法只是暂时让出CPU的执行权,并不释放锁。而wait方法则需要释放锁。

yield方法的作用是暂停当前线程,以便其他线程有机会执行,不过不能指定暂停的时间,并且也不能保证当前线程马上停止。yield方法只是将Running状态转变为Runnable状态。

join方法的作用是父线程等待子线程执行完成后再执行,换句话说就是将异步执行的线程合并为同步的线程。

三轮

零拷贝技术,
两种零拷贝方案 MMap sendfile
MMap三次拷贝 sendfile两次拷贝,多出的一次是CPU拷贝 从内核拷贝到用户进程
rocketMQ使用MMAP Kafka使用sendfile 所以rocketmq能达到十万级别,kafka能达到百万级别
但为什么rocketmq不适用sendfile 因为rocketmq可以处理消息的顺序,消息的过滤
Kafka不能完成,因为sendfile压根就没有到达数据应用层,内核中无法处理这些操作。

上一篇 下一篇

猜你喜欢

热点阅读