每日五道java面试题之java基础篇(十二)

这篇具有很好参考价值的文章主要介绍了每日五道java面试题之java基础篇(十二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

每日五道java面试题之java基础篇(十二),java面试题,java,开发语言,面试

第一题 谈谈你对AQS的理解,AQS如何实现可重⼊锁?

  1. AQS是⼀个JAVA线程同步的框架。是JDK中很多锁⼯具的核⼼实现框架。
  2. 在AQS中,维护了⼀个信号量state和⼀个线程组成的双向链表队列。其中,这个线程队列,就是⽤来给线程排队的,⽽state就像是⼀个红绿灯,⽤来控制线程排队或者放⾏的。 在不同的场景下,有不⽤的意义。
  3. 在可重⼊锁这个场景下,state就⽤来表示加锁的次数。0标识⽆锁,每加⼀次锁,state就加1。释放锁state就减1。

第二题. Sychronized的偏向锁、轻量级锁、重量级锁

  1. 偏向锁:在锁对象的对象头中记录⼀下当前获取到该锁的线程ID,该线程下次如果⼜来获取该锁就可以直接获取到了
  2. 轻量级锁:由偏向锁升级⽽来,当⼀个线程获取到锁后,此时这把锁是偏向锁,此时如果有第⼆个线程来竞争锁,偏向锁就会升级为轻量级锁,之所以叫轻量级锁,是为了和重量级锁区分开来,轻量级锁底层是通过⾃旋来实现的,并不会阻塞线程
  3. 如果⾃旋次数过多仍然没有获取到锁,则会升级为重量级锁,重量级锁会导致线程阻塞
  4. ⾃旋锁:⾃旋锁就是线程在获取锁的过程中,不会去阻塞线程,也就⽆所谓唤醒线程,阻塞和唤醒这两个步骤都是需要操作系统去进⾏的,⽐较消耗时间,⾃旋锁是线程通过CAS获取预期的⼀个标记,如果没有获取到,则继续循环获取,如果获取到了则表示获取到了锁,这个过程线程⼀直在运⾏中,相对⽽⾔没有使⽤太多的操作系统资源,⽐较轻量。

第三题 CountDownLatch和Semaphore的区别和底层原理

CountDownLatch表示计数器,可以给CountDownLatch设置⼀个数字,⼀个线程调⽤CountDownLatch的await()将会阻塞,其他线程可以调⽤CountDownLatch的countDown()⽅法来对CountDownLatch中的数字减⼀,当数字被减成0后,所有await的线程都将被唤醒。

对应的底层原理就是,调⽤await()⽅法的线程会利⽤AQS排队,⼀旦数字被减为0,则会将AQS中排队的线程依次唤醒。

Semaphore表示信号量,可以设置许可的个数,表示同时允许最多多少个线程使⽤该信号量,通过acquire()来获取许可,如果没有许可可⽤则线程阻塞,并通过AQS来排队,可以通过release()⽅法来释放许可,当某个线程释放了某个许可后,会从AQS中正在排队的第⼀个线程开始依次唤醒,直到没有空闲许可。

第四题 线程池中阻塞队列的作⽤?为什么是先添加列队⽽不是先创建最⼤线程?

1、⼀般的队列只能保证作为⼀个有限⻓度的缓冲区,如果超出了缓冲⻓度,就⽆法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续⼊队的任务。
阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程进⼊wait状态,释放cpu资源。

阻塞队列⾃带阻塞和唤醒的功能,不需要额外处理,⽆任务执⾏时,线程池利⽤阻塞队列的take⽅法挂起,从⽽维持核⼼线程的存活、不⾄于⼀直占⽤cpu资源
2、在创建新线程的时候,是要获取全局锁的,这个时候其它的就得阻塞,影响了整体效率。
就好⽐⼀个企业⾥⾯有10个(core)正式⼯的名额,最多招10个正式⼯,要是任务超过正式⼯⼈数(task > core)的情况下,⼯⼚领导(线程池)不是⾸先扩招⼯⼈,还是这10⼈,但是任务可以稍微积压⼀下,即先放到队列去(代价低)。10个正式⼯慢慢⼲,迟早会⼲完的,要是任务还在继续增加,超过正式⼯的加班忍耐极限了(队列满了),就的招外包帮忙了(注意是临时⼯)要是正式⼯加上外包还是不能完成任务,那新来的任务就会被领导拒绝了(线程池的拒绝策略)。

第五题 对守护线程的理解

守护线程:为所有⾮守护线程提供服务的线程;任何⼀个守护线程都是整个JVM中所有⾮守护线程的保姆;

守护线程类似于整个进程的⼀个默默⽆闻的⼩喽喽;它的⽣死⽆关重要,它却依赖整个进程⽽运⾏;哪天其他线程结束了,没有要执⾏的了,程序就结束了,理都没理守护线程,就把它中断了;

注意: 由于守护线程的终⽌是⾃身⽆法控制的,因此千万不要把IO、File等重要操作逻辑分配给它;因为它不靠谱;
守护线程的作⽤是什么?
举例, GC垃圾回收线程:就是⼀个经典的守护线程,当我们的程序中不再有任何运⾏的Thread,程序就不会再产⽣垃圾,垃圾回收器也就⽆事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会⾃动离开。它始终在低级别的状态中运⾏,⽤于实时监控和管理系统中的可回收资源。

应⽤场景:(1)来为其它线程提供服务⽀持的情况;(2) 或者在任何情况下,程序结束时,这个线程必须正常且⽴刻关闭,就可以作为守护线程来使⽤;反之,如果⼀个正在执⾏某个操作的线程必须要正确地关闭掉否则就会出现不好的后果的话,那么这个线程就不能是守护线程,⽽是⽤户线程。通常都是些关键的事务,⽐⽅说,数据库录⼊或者更新,这些操作都是不能中断的。

thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出⼀个IllegalThreadStateException异常。你不能把正在运⾏的常规线程设置为守护线程。

在Daemon线程中产⽣的新线程也是Daemon的。

守护线程不能⽤于去访问固有资源,⽐如读写操作或者计算逻辑。因为它会在任何时候甚⾄在⼀个操作的中间发⽣中断。

Java⾃带的多线程框架,⽐如ExecutorService,会将守护线程转换为⽤户线程,所以如果要使⽤后台线程就不能⽤Java的线程池。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力
每日五道java面试题之java基础篇(十二),java面试题,java,开发语言,面试文章来源地址https://www.toymoban.com/news/detail-829246.html

到了这里,关于每日五道java面试题之java基础篇(十二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 每日一道面试题之在java中,有哪些方式可以实现对象的实例化?

    在 Java 中,实例化对象有以下几种方式: 使用 new : 使用 new 可以 直接调用类的构造方法 来实例化对象。 例如: 使用反射: 通过反射机制,可以 在运行时动态地实例化对象 。使用 Class 类的 newInstance() 方法 可以创建一个类的实例。 例如: 使用 clone() 方法

    2024年02月12日
    浏览(34)
  • 每日一道面试题之什么是反射?

    反射是一种自我观察的能力,在程序运行时,对任意一个类,我们可通过 class、constructor、field、method 四个方法获取该类的各个组成部分,在java程序运行时,对任意类,我们都可通过该类了解到其包含哪些属性和方法,这种 动态获取当前类对象的信息以及动态调用对象方法的

    2024年02月08日
    浏览(47)
  • 每日一道面试题之介绍一下Iterator

    Iterator是Java中的一个接口 , 用于遍历集合(Collection)中的元素 。通过Iterator,可以 按顺序访问集合中的每个元素 ,而无需了解集合的内部实现细节。 通过调用集合的 iterator()方法获取Iterator对象 。例如: 使用 while循环和hasNext()方法判断是否还有下一个元素 。例如: 使用

    2024年02月15日
    浏览(32)
  • 大数据面试题之Elasticsearch:每日三题(七)

    协调节点默认使用文档ID参与计算(也支持通过routing),以便为路由提供适合的分片:shard=hash(document_id)%(num_of_primary_shards) 当分片所在的节点接收到来自协调节点的请求后,会将请求写到Memory Buffer,然后定时(默认是每隔1秒)写入到Filesystem Cache,这个从Memory Buffer到Filesystem C

    2024年02月15日
    浏览(34)
  • 每日一道面试题之list和set有什么区别?

    List和Set 是 Java集合框架中的两个接口 ,虽然它们都继承自Collection接口,但在使用上有一些区别。 有序性 : List是有序的集合 ,它 按照元素的插入顺序进行存储和访问 。可以 通过索引来访问List中的元素 。而 Set是无序的集合 ,它不保证元素的顺序,也 不能通过索引来访问

    2024年02月16日
    浏览(39)
  • 每日一道面试题之Collection 和 Collections 有什么区别?

    Collection和Collections是Java集合框架中的两个重要的概念,它们在Java集合框架中扮演不同的角色。 Collection 是 Java集合框架中的一个接口 ,它是 所有集合类的根接口 , 用于操作和管理一组对象 ,Collection接口的常见实现类包括 List、Set和Queue 等,分别定义了不同的存储方式。

    2024年02月16日
    浏览(38)
  • 每日一道面试题之ArrayList 和 LinkedList 的区别是什么?

    ArrayList 和 LinkedList 是Java中常用的两种集合类,它们在实现和使用上有一些区别,如下所示: 内部实现 : ArrayList 是 基于数组实现 的动态数组,而 LinkedList 是 基于双向链表 实现的。 插入和删除操作 : ArrayList 在插入和删除元素时,需要移动其他元素来保持其数组元素位置

    2024年02月16日
    浏览(42)
  • 每日一道面试题之final、finally、finalize 有什么区别?

    final是Java中的 ,用于 修饰变量、方法或类 ,被final修饰的类表示 该类不能被继承 ,被final修饰的变量表示 该变量不能赋新的值 ,被final修饰的方法表示 该方法不能被重写 . finally是Java中的 ,用于 定义在try-catch语句块中的一个代码块 ,无论是否发生异常都会执

    2024年02月08日
    浏览(43)
  • 每日一道面试题之介绍一下常见的异常类有哪些?

    常见的异常类包括: NullPointerException(空指针异常): 例如: SQLException:(数据库相关的异常): 例如: IndexOutOfBoundsException(下标越界异常): 例如: IllegalArgumentException(非法参数异常): 例如: IllegalStateException(非法状态异常): 例如: ClassCastException(类型转换异常

    2024年02月08日
    浏览(43)
  • 每日一道面试题之如何实现数组和 List 之间的转换?

    要实现数组和List之间的转换,可以使用Java中的 Arrays类 和 Collections类 提供的方法。 数组转换为List: 使用 Arrays类 的 asList()方法 可以 将数组转换为List 。这个方法接受一个数组作为参数,并返回一个包含数组元素固定大小的List。 举例: 输出如下所示: List转换为数组: 使

    2024年02月16日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包