首页 > 其他分享 >3.他人面试题

3.他人面试题

时间:2024-03-20 12:34:34浏览次数:25  
标签:面试题 加锁 回收 获取 线程 引用 GC 他人

1.ReentrantLock的实现原理

  ReentrantLock是一个可重入的互斥锁,具有尝试非阻塞地获取锁、可中断的锁获取、支持公平性等特点。ReentrantLock通过内部类Sync实现核心功能,Sync继承了AQS类(构建锁和其他同步组件的框架)。AQS通过int型的成员变量表示同步状态,通过内置的FIFO来管理线程的排队等待。

可重入性

  当一个线程获取了 ReentrantLock 后,它可以再次获取该锁而不会造成死锁,这是因为 ReentrantLock记录当前拥有锁的线程以及该线程获取锁的次数。只有当该线程释放锁的次数与它获取锁的次数相同时,锁才会被真正释放

锁获取

  • lock():调用此方法会使当前线程尝试获取锁。如果锁不可用,当前线程会被阻塞,直到锁可用。
  • tryLock():尝试非阻塞地获取锁。如果锁可用,当前线程获取锁并立即返回 true;否则返回 false,不会等待。
  • tryLock(long timeout, TimeUnit unit):尝试在指定的时间内获取锁。如果在给定时间内锁可用,当前线程获取锁并返回 true;如果超时或锁不可用,返回 false。

2.垃圾回收算法

  垃圾回收器用于自动管理Java内存。垃圾回收器算法有Serial GC、Parallel GC/Parallel Old GC、CMS以及G1等算法

 Serial GC:Serial GC是单线程的垃圾回收器垃圾回收时会暂停所有用户线程(STW)、包括新生代的Minor GC和老年代的Major GC,采用标记清除或标记压缩算法

Parallel GC:Parallel GC是Serial GC的并行版本,在多核环境下使用多个线程进行垃圾回收,回收过程中暂停所有用户线程。多核环境行性能较好,显著缩短STW时间;并发场景下,并行处理可能导致系统负载较大;采用复制算法进行垃圾回收

CMS:初始标记、并发标记、重新标记、并发清除大部分工作并发执行,减少STW,适用于响应高场景。采用标记-清除算法,碎片化严重,需定期进行并发压缩

G1:区域化管理(分代,即新生代和老年代)、并发标记、空间回收、完整GC采用标记-整理算法进行实时垃圾回收大量小对象回收不如其他收集器

3.Redis的分布式锁实现

   Redis的分布式锁实现依赖于其原子性和高性能。

3.1.使用SETNX命令

SERNX(SET if Not eXists)命令用于在键不存在时设置键值。该命令可用于简单实现分布式锁:

  • 加锁:SETNX lockKey;
  1. 如果lockKey不存在,SETNX会设置键并返回1表示成功获取锁
  2. 如果lockKey存在,SETNX不会设置键并返回9表示获取锁失败
  • 解锁:使用DEL lockKeyy命令删除锁

3.2 使用SET命令带过期时间

SET命令可以结合EX或PX选项设置键的过期时间,避免锁无限期持有

  • 加锁:SET lockKey value EX 30SET lockKey value PX 30000

    • EX后跟秒数,PX后跟毫秒数,表示锁的过期时间。
    • NX选项确保只在键不存在时设置值。
  • 解锁:同样使用DEL lockKey命令。

3.3 使用Lua脚本与Redis的call方法结合

3.4 RedLock算法

  RedLock是一种更安全的分布式锁实现,它通过在多个Redis实例上尝试获取锁提高锁的可靠性。

  1. 客户端获取当前时间戳。
  2. 依次尝试在多个Redis实例上加锁,每个实例都需要设定相同的过期时间和随机字符串(nonce)。
  3. 客户端计算加锁操作的总时间,并将其与指定的超时时间进行比较。如果总时间小于超时时间,并且超过一半的Redis实例加锁成功,则认为加锁成功。否则,客户端需要在所有实例上尝试解锁操作。

3.5 注意事项:

  • 安全性:确保解锁操作只能由加锁的客户端执行,避免误删其他客户端的锁。
  • 死锁预防设置锁的过期时间以避免死锁
  • 重试机制:在获取锁失败时,可能需要重试。
  • 锁的公平性:确保所有客户端都有公平的机会获取锁。

4.强引用、软引用、弱引用、虚引用

  在Java中,对象引用分为强、软、弱、虚等四种引用。四种对象引用的强度依次减弱,对GC也有不同的影响。

强引用:

  强引用是Java中最常见的引用类型。当对象被强引用关联时,它将一直被保留在内存中,直到强引用被显式地断开(例如,将其设置为null。只要强引用存在,垃圾收集器就不会回收这个对象

Object obj = new Object()

软引用:软引用关联的对象在内存不足时才会被垃圾收集器回收。软引用通常用于实现内存敏感的缓存,可以通过java.lang.ref.SoftReference类创建

SoftReference<Object>softRef = new SoftReference<>(new Object)

弱引用:只要垃圾收集器运行,弱引用关联的对象就可能被回收不管当前内存是否充足。弱引用通常用于实现缓存等需要快速响应内存变化的场景。(ThreadLocal)

WeakReference<Object>weakRef = new WeakRefernce<>(new Object);

虚引用:虚引用几乎不阻止垃圾收集器回收关联的对象。虚引用主要用于跟踪对象被回收的状态,当对象即将被回收时,可以将虚引用加入到一个引用队列中,从而可以执行一些清理工作

标签:面试题,加锁,回收,获取,线程,引用,GC,他人
From: https://www.cnblogs.com/kzf-99/p/18083164

相关文章

  • 01-java面试题-----java基础——20题
    文章目录<fontcolor="red">1、java语言有哪些特点:<fontcolor="red">2、面向对象和面向过程的区别<fontcolor="red">3、标识符的命名规则。<fontcolor="red">4、八种基本数据类型的大小,以及他们的封装类<fontcolor="red">5、instanceof关键字的作用......
  • 史上最全Java核心面试题(带全部答案)2024年最新版
    今天要谈的主题是关于求职,求职是在每个技术人员的生涯中都要经历多次。对于我们大部分人而言,在进入自己心仪的公司之前少不了准备工作,有一份全面细致面试题将帮助我们减少许多麻烦。在跳槽季来临之前,特地做这个系列的文章,一方面帮助自己巩固下基础,另一方面也希望帮助想要换工......
  • C++高级面试题:解释 C++ 中的函数对象适配器
    解释C++中的函数对象适配器函数对象适配器是C++中的一种编程技术,用于修改或增强现有的函数对象的行为。它们通常通过组合或包装现有的函数对象来实现所需的功能。函数对象适配器允许我们在不修改原始函数对象的情况下,对其进行修改或扩展。这样可以实现代码的重用和可......
  • 前端面试题
    1、vue2和vue3的主要区别1、性能优化:Vue3对虚拟DOM进行了优化,例如使用了更高效的算法,缩减了代码量。此外,Vue3还利用Proxy代理优化了响应式系统,提高了性能。2、新特性:Vue3引入了CompositionAPI,是一种函数式API。CompositionAPI使得组合逻辑更加容易,能够更好地重用组件逻辑。......
  • 标准分区和lvm分区-面试题-区别
    标准分区和lvm分区-面试题-区别安装linux系统时有时候会提示lvm分区与标准分区首先普及一下lvm分区:lvm是logicalvolumemanager(逻辑卷管理),linux环境下对磁盘分区的管理;他解决了安装系统时候如何确定分区大小的问题,具体原因看下面的理解普通的磁盘分区管理方式在逻辑分区......
  • 新鲜的企业面试题
    家人们,拿不到100分,就业属实是有点困难了,加油啊,......
  • 腾讯春招内参:2024最全Spring Boot面试题解析,技术精英必备!
    随着2024年春季招聘季的来临,腾讯再次开启了对富有才华和创新精神的技术人才的寻找之旅。作为一家全球领先的互联网科技公司,腾讯在寻找那些不仅拥有扎实的技术基础,而且能够适应快速发展和变化的行业环境的候选人。在众多技术栈中,SpringBoot作为简化Spring应用开发的工具,因其......
  • Java基础面试题(2)
    概要本文旨在帮助读者更好地准备Java基础面试,通过详细解析常见的Java基础面试题,让读者对Java语言的核心概念有更深入的理解和掌握。文章将围绕Java的语法基础、面向对象编程、异常处理、集合框架、多线程编程以及输入输出流等关键领域展开,为面试者提供全面的指导和参考。1.解......
  • 面试题整理
    1、自我介绍面试官好,我叫。我有5年多的软件测试经验。在工作中,熟练掌握了各种测试方法和工具,包括黑盒测试、白盒测试、自动化测试、性能测试、安全测试等。有一定的编程能力,能够根据需要编写测试用例和脚本。有良好的沟通能力和团队协作能力,能够与开发人员、产品经理等各部门人员......
  • vue面试题(vue2响应式源码剖析)
    一、前言这篇文章结合Vue2.7.16的源码和一个Vue2的项目,来详细讲解Vue2实现响应式数据的核心代码1.1准备安装@vue/clinpminstall-g@vue/cli创建vue项目vuecreatevue2-test修改Vue实例的配置对象二、响应式处理的入口通过newVue()调用Vue构造函数,......