小马哥直播间面试题浅析

Posted by 月光下的海 on April 12, 2023

JUC并发包用过哪些?

待更新。。

读写锁实现的区别?

待更新。。

信号量的实现机制?

待更新。。

ConcurrentHashMap为什么不能插入null?

  • 设计如此。源码中做了限制,如果k或者v为空时会抛出空指针异常
 final V putVal(K key, V value, boolean onlyIfAbsent) {
	if (key == null || value == null) throw new NullPointerException();
     ....
     ....
 }
  • 深究为什么这样设计?就是考虑并发场景下的二义性。

  • 对于 HashMap 可以插入null值,单线程情况下,Map.get(key) == null 时,使用containsKey方法便可判断是 key 不存在,还是存在但 value 就是 null

  • 对于 ConcurrentHashMap 在多线程场景下,以上情况就不适用了。可能有另外一个线程在当前线程调用containsKey 方法前执行了put(key,null)的操作。也就是说在线程1执行 get(key) == null 时,预期的containsKey 应该返回的是 false,即 key 不存在。但当执行到 containsKey 方法时,却获得的是 true。

如何限流,有哪些方式?(可以参考sentinel)

  • Guava 的 RateLimiter。RateLimiter 是基于令牌桶流控算法,使用非常简单,但是功能相对比较少。

  • Sentinel 是阿里巴巴提供的一种限流、熔断中间件,与 RateLimiter 相比,Sentinel 提供了丰富的限流、熔断功能。它支持控制台配置限流、熔断规则,支持集群限流,并可以将相应服务调用情况可视化。

Fegin如何结合ribbon实现负载均衡,hystryx如何实现?

待更新。。

业务场景的库存超卖,聊到分布式锁的实现,redis集群。redis cluster做分布式锁会不会有问题?

待更新。。

OOM后其他接口还能提供服务吗?JVM做了什么?

  • 其他接口可以提供服务。第一个是 OOM 只会影响当前线程,导致当前线程退出。但只要存在非守护线程,JVM 就不会退出,除非所有线程都发生了 OOM。再一个是 OOM 是可以被 try-catch 捕获的,虽然这不推荐也没太大意义。
  • JVM 会发生 full gc,导致系统停顿时间过长。并且其他线程也申请不到需要的内存的话,接口响应变慢,此时看到的现象就是系统卡顿,但是Java进程还在。
  • 可能会触发 Linux 的 OOM Killer 机制。在系统内存不足时,会杀掉一些占用内存很高的进程。Java 进程内存如果占用过高,会被系统直接杀掉。如果发生这种情况,可以在系统日志里面查看。比如使用grep "out of memory" /var/log/messages或者 dmesg命令