互联网Java工程师面试题·Java 并发编程篇·第五弹

这篇具有很好参考价值的文章主要介绍了互联网Java工程师面试题·Java 并发编程篇·第五弹。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

52、什么是线程池? 为什么要使用它?

53、怎么检测一个线程是否拥有锁?

54、你如何在 Java 中获取线程堆栈?

55、JVM 中哪个参数是用来控制线程的栈堆栈小的?

56、Thread 类中的 yield 方法有什么作用?

57、Java 中 ConcurrentHashMap 的并发度是什么?

58、Java 中 Semaphore 是什么?

59、Java 线程池中 submit() 和 execute()方法有什么区别?

60、什么是阻塞式方法?

61、Java 中的 ReadWriteLock 是什么?

62、volatile 变量和 atomic 变量有什么不同?

63、可以直接调用 Thread 类的 run ()方法么?

64、如何让正在运行的线程暂停一段时间?

65、你对线程优先级的理解是什么?

66、什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing )?

67、你如何确保 main()方法所在的线程是 Java 程序最后结束的线程?

68、线程之间是如何通信的?

69、为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里?

70、为什么 wait(), notify()和 notifyAll ()必须在同步方法或者同步块中被调用?

71、为什么 Thread 类的 sleep()和 yield ()方法是静态的?

72、如何确保线程安全?

73、同步方法和同步块,哪个是更好的选择?

74、如何创建守护线程?

75、什么是 Java Timer 类?如何创建一个有特定时间间隔的任务?


52、什么是线程池? 为什么要使用它?

创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从JDK1.5 开始,Java API 提供了 Executor 框架让你可以创建不同的线程池。


53、怎么检测一个线程是否拥有锁?

在 java.lang.Thread 中有一个方法叫 holdsLock(),它返回 true 如果当且仅当当前线程拥有某个具体对象的锁。


54、你如何在 Java 中获取线程堆栈?

kill -3 [java pid]

不会在当前终端输出,它会输出到代码执行的或指定的地方去。比如,kill -3 tomcat pid, 输出堆栈到 log 目录下。

Jstack [java pid]

这个比较简单,在当前终端显示,也可以重定向到指定文件中。

-JvisualVM:Thread Dump

不做说明,打开 JvisualVM 后,都是界面操作,过程还是很简单的。


55、JVM 中哪个参数是用来控制线程的栈堆栈小的?

-Xss 每个线程的栈大小


56、Thread 类中的 yield 方法有什么作用?

使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。

当前线程到了就绪状态,那么接下来哪个线程会从就绪状态变成执行状态呢?可能是当前线程,也可能是其他线程,看系统的分配了。


57、Java 中 ConcurrentHashMap 的并发度是什么?

ConcurrentHashMap 把实际 map 划分成若干部分来实现它的可扩展性和线程安全。这种划分是使用并发度获得的,它是 ConcurrentHashMap 类构造函数的一个可选参数,默认值为 16,这样在多线程情况下就能避免争用。

在 JDK8 后,它摒弃了 Segment(锁段)的概念,而是启用了一种全新的方式实现,利用 CAS 算法。同时加入了更多的辅助变量来提高并发度,具体内容还是查看源码吧。


58、Java 中 Semaphore 是什么?

Java 中的 Semaphore 是一种新的同步类,它是一个计数信号。从概念上讲,从概念上讲,信号量维护了一个许可集合。如有必要,在许可可用前会阻塞每一个acquire(),然后再获取该许可。每个 release()添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。信号量常常用于多线程的代码中,比如数据库连接池。


59、Java 线程池中 submit() 和 execute()方法有什么区别?

两个方法都可以向线程池提交任务,execute()方法的返回类型是 void,它定义在Executor 接口中。

而 submit()方法可以返回持有计算结果的 Future 对象,它定义在ExecutorService 接口中,它扩展了 Executor 接口,其它线程池类像ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 都有这些方法。


60、什么是阻塞式方法?

阻塞式方法是指程序会一直等待该方法完成期间不做其他事情,ServerSocket 的accept()方法就是一直等待客户端连接。这里的阻塞是指调用结果返回之前,当前线程会被挂起,直到得到结果之后才会返回。此外,还有异步和非阻塞式方法在任务完成前就返回。


61、Java 中的 ReadWriteLock 是什么?

读写锁是用来提升并发程序性能的锁分离技术的成果。


62、volatile 变量和 atomic 变量有什么不同?

Volatile 变量可以确保先行关系,即写操作会发生在后续的读操作之前, 但它并不能保证原子性。例如用 volatile 修饰 count 变量那么 count++ 操作就不是原子性的。

而 AtomicInteger 类提供的 atomic 方法可以让这种操作具有原子性如getAndIncrement()方法会原子性的进行增量操作把当前值加一,其它数据类型和引用变量也可以进行相似操作。


63、可以直接调用 Thread 类的 run ()方法么?

当然可以。但是如果我们调用了 Thread 的 run()方法,它的行为就会和普通的方法一样,会在当前线程中执行。为了在新的线程中执行我们的代码,必须使用Thread.start()方法。


64、如何让正在运行的线程暂停一段时间?

我们可以使用 Thread 类的 Sleep()方法让线程暂停一段时间。需要注意的是,这并不会让线程终止,一旦从休眠中唤醒线程,线程的状态将会被改变为 Runnable,并且根据线程调度,它将得到执行。


65、你对线程优先级的理解是什么?

每一个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关的(OS dependent)。我们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个 int 变量(从 1-10),1 代表最低优先级,10 代表最高优先级。

java 的线程优先级调度会委托给操作系统去处理,所以与具体的操作系统优先级有关,如非特别需要,一般无需设置线程优先级。


66、什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing )?

线程调度器是一个操作系统服务,它负责为 Runnable 状态的线程分配 CPU 时间。一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。同上一个问题,线程调度并不受到 Java 虚拟机控制,所以由应用程序来控制它是更好的选择(也就是说不要让你的程序依赖于线程的优先级)。

时间分片是指将可用的 CPU 时间分配给可用的 Runnable 线程的过程。分配 CPU时间可以基于线程优先级或者线程等待的时间。


67、你如何确保 main()方法所在的线程是 Java 程序最后结束的线程?

我们可以使用 Thread 类的 join()方法来确保所有程序创建的线程在 main()方法退出前结束。


68、线程之间是如何通信的?

当线程间是可以共享资源时,线程间通信是协调它们的重要的手段。Object 类中wait()\notify()\notifyAll()方法可以用于线程间通信关于资源的锁的状态。

69、为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里?

Java 的每个对象中都有一个锁(monitor,也可以成为监视器) 并且 wait(),notify()等方法用于等待对象的锁或者通知其他线程对象的监视器可用。在 Java 的线程中并没有可供任何对象使用的锁和同步器。这就是为什么这些方法是 Object 类的一部分,这样 Java 的每一个类都有用于线程间通信的基本方法。


70、为什么 wait(), notify()和 notifyAll ()必须在同步方法或者同步块中被调用?

当一个线程需要调用对象的 wait()方法的时候,这个线程必须拥有该对象的锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象上的 notify()方法。同样的,当一个线程需要调用对象的 notify()方法时,它会释放这个对象的锁,以便其他在等待的线程就可以得到这个对象锁。由于所有的这些方法都需要线程持有对象的锁,这样就只能通过同步来实现,所以他们只能在同步方法或者同步块中被调用。


71、为什么 Thread 类的 sleep()和 yield ()方法是静态的?

Thread 类的 sleep()和 yield()方法将在当前正在执行的线程上运行。所以在其他处于等待状态的线程上调用这些方法是没有意义的。这就是为什么这些方法是静态的。它们可以在当前正在执行的线程中工作,并避免程序员错误的认为可以在其他非运行线程调用这些方法。


72、如何确保线程安全?

在 Java 中可以有很多方法来保证线程安全——同步,使用原子类(atomic concurrent classes),实现并发锁,使用 volatile 关键字,使用不变类和线程安全类。


73、同步方法和同步块,哪个是更好的选择?

同步块是更好的选择,因为它不会锁住整个对象(当然你也可以让它锁住整个对象)。同步方法会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁。同步块更要符合开放调用的原则,只在需要锁住的代码块锁住相应的对象,这样从侧面来说也可以避免死锁。


74、如何创建守护线程?

使用 Thread 类的 setDaemon(true)方法可以将线程设置为守护线程,需要注意的是,需要在调用 start()方法前调用这个方法,否则会抛出IllegalThreadStateException 异常。


75、什么是 Java Timer 类?如何创建一个有特定时间间隔的任务?

java.util.Timer 是一个工具类,可以用于安排一个线程在未来的某个特定时间执行。Timer 类可以用安排一次性任务或者周期任务。

java.util.TimerTask 是一个实现了 Runnable 接口的抽象类,我们需要去继承这个类来创建我们自己的定时任务并使用 Timer 去安排它的执行。


要想了解更多:

千题千解·Java面试宝典_时光の尘的博客-CSDN博客

互联网Java工程师面试题·Java 并发编程篇·第五弹,千题千解·Java面试宝典,java,开发语言,ReadWriteLock,Thread文章来源地址https://www.toymoban.com/news/detail-725798.html

到了这里,关于互联网Java工程师面试题·Java 并发编程篇·第五弹的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 2023Java 岗面试,进互联网大厂必备 Java 面试八股文真题解析

    前言 一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。 很多时候,面试官问的问题会和自己准备的“题库”中的问题不太一样,即使做了复盘,下次面试还是不知道该从何处下手。 为此鄙人软磨硬泡才把阿里 P8 专门归纳整理的 《Java 进阶知识典

    2024年02月15日
    浏览(36)
  • 华为Java工程师面试题

    常见问题: 什么是Java虚拟机(JVM)?它与现实中的计算机有什么不同? Java中的基本数据类型有哪些?它们的范围是什么? 什么是引用类型?Java中的引用类型有哪些? 什么是对象?什么是类?它们之间的关系是什么? Java中如何实现继承?继承的好处和缺点是什么? 什么是

    2024年02月08日
    浏览(36)
  • 2023年互联网Java面试复习大纲:ZK+Redis+MySQL+Java基础+架构

    多数的公司总体上面试都是以自我介绍+项目介绍+项目细节/难点提问+基础知识点考核+算法题这个流程下来的。有些公司可能还会问几个实际的场景类的问题,这个环节阿里是必问的,这种问题通常是没有正确答案的,就看个人的理解,个人的积累了。剩下的就没啥了,都是

    2024年02月09日
    浏览(70)
  • JAVA工程师面试专题-JVM篇

    目录 一、运行时数据区 1、说一下JVM的主要组成部分及其作用? 2、说一下 JVM 运行时数据区 ? 3、说一下堆栈的区别 4、成员变量、局部变量、类变量分别存储在什么地方? 5、类常量池、运行时常量池、字符串常量池有什么区别? 6、JVM为什么使用元空间替换永久代 二、垃

    2024年02月21日
    浏览(33)
  • 2023互联网大厂最全Java面试八股文(附大厂 P5-P8 技术栈)

    为什么感觉 Java 面试变难了? 几年前,你只需要简单的 ssm 框架 ,就能轻松找到一份 Java 的工作,但现在不一样了,随着涌入这个行业的人越来越多,同一个岗位需要筛选掉更多人,要求自然水涨船高, 这也就是现在越来越多 Java 程序员抱怨行业越来越卷的原因 ,当然这个

    2024年02月15日
    浏览(38)
  • 金三银四互联网大厂秋招精选 1160 道 Java 面试题答案整理(2023 最新版)

    今年的大环境而言,面试成功的难度比往年高了很多,很明显的感受就是:对于今年的 java 开发朋友面试, 无论一面还是二面,都开始考验一个 Java 程序员的技术功底和基础。 Java 基础掌握不牢,对于一个开发人员来说无疑是非常致命的。学习任何一个技术知识无疑不是从基

    2024年02月09日
    浏览(36)
  • java工程师面试技巧和方法,这份Github标星50K,相关资料参考

    Dubbo 为什么要用 Dubbo? Dubbo 的整体架构设计有哪些分层? 默认使用的是什么通信框架,还有别的选择吗? 服务调用是阻塞的吗? 一般使用什么注册中心?还有别的选择吗? 默认使用什么序列化框架,你知道的还有哪些? 服务提供者能实现失效提出是什么原理? 服务上线怎么

    2024年04月16日
    浏览(39)
  • 【面试】互联网相关面试题

    这个问题一般都是面试的必问题,通常也是面试中的第一道题!时间应当控制在一分钟左右。 从我们上小学开始,老师上课的第一件事就都是先让大家做下自我介绍,以便增强大家对你的了解,在现在的企业面试中也是一样的道理,一般人回答这个问题过于平常,只说姓名、

    2023年04月11日
    浏览(33)
  • java智慧工地云平台源码,以物联网、移动互联网技术为基础,结合大数据、云计算等,实现工程管理绿色化、数字化、精细化、智能化的效果

    智慧工地将更多人工智能、传感技术、虚拟现实等高科技技术植入到建筑、机械、人员穿戴设施、场地进出关口等各类物体中,围绕人、机、料、法、环等各方面关键因素,彻底改变传统建筑施工现场参建各方现场管理的交互方式、工作方式和管理模式,智慧工地主要以物联

    2024年02月08日
    浏览(41)
  • 面试互联网企业的经验

    持续更新中...... 因为博主今年研二,目前是8月初,正在找工作,所以在这里分享总结一下自己面试得到的经验。(因为学校较好,所以一般简历不会挂我,大小厂都会给机会...) 1. 不要紧张,语速放慢 从我的两段大厂实习经历来看,大厂的员工从学历到能力方面,和自己的差

    2024年02月14日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包