java线程面试题集锦(第一版本)

简介: java线程面试题集锦(第一版本)

一、线程基础


1、什么是线程?什么是进程?他们之间有什么区别?线程的好处和坏处?(坏处从单核CPU上下文切换带来系统损耗来解答)


2、Java中实现线程有那几种方式?区别是什么?(三种或者四种,根据继承和接口特点区别)


3、Thread类中的start和run方法的区别?(start方法内部含有native的start0,官方文档解释start0内部调用了run方法)


4、守护线程和非守护线程的区别?(服务员服务顾客的例子)


5、为什么wait, notify 和 notifyAll这些方法不在thread类里面?(这些操作都是锁级别操作,每个对象都有锁,所以定义在对象中)


6、Java中什么是竞态条件? 举个例子说明。(两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件,导致竞态条件发生的代码区称作临界区。在临界区中使用适当的同步锁就可以避免竞态条件)


7、Java中如何停止一个线程?(从jdk1.0的stop、suspend、resume被遗弃说起,再到自然停止线程,或者使用volatile+boolean变量手动停止线程)。


8、sleep和wait的区别?


(四个:1、sleep是线程中的方法,但是wait是Object中的方法。


2、sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。


3、sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。


4、sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别人中断)。)


9、Java中interrupted 和 isInterruptedd方法的区别?(主要区别是前者会将中断状态清除而后者不会)


10、如何在两个线程间共享数据?(根据多个线程的代码是否相同判断是否使用同一个Runnable对象)


11、java的内存模型?(首先说出和内存结构的区别、然后是为什么需要内存模型(从计算机发展的角度来看逐步过渡到原子性、可见性、有序性),最后就是java内存模型如何解决上面三个问题);


12、有三个线程T1,T2,T3,怎么确保它们按顺序执行?(多个方法,常见的join极其机制)


13、Thread类中的yield方法有什么作用?(作用是暂停当前正在执行的线程对象,让其它有相同优先级的线程执行,静态方法,只是可能性,不能保证确定性)


14、多线程中的忙循环是什么?(忙循环就是程序员用循环让一个线程等待,不像传统方法wait(), sleep() 或 yield() 它们都放弃了CPU控制,而忙循环不会放弃CPU,它就是在运行一个空循环。这么做的目的是为了保留CPU缓存,在多核系统中,一个等待线程醒来的时候可能会在另一个内核运行,这样会重建缓存。为了避免重建缓存和减少等待重建的时间就可以使用它了。)


线程基础知识主要是线程相关的一些概念和api进行理解。


二、线程池


1、为什么要使用线程池?(反过来说,创建销毁线程的代价太高,再正过来说线程池的好处)


2、线程池有什么用?(提高效率、方便管理)


3、使用过哪些线程池?有什么使用场景?(newSingleThreadExecutor、newFixedThreadPool、newCachedThreadPool、newScheduledThreadPool,newWorkStealingPool)


4、线程池的七个参数的作用


int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler

5、线程池的工作队列(ArrayBlockingQueue、LinkedBlockingQueue、

SynchronousQueue、PriorityBlockingQueue)


6、线程池的拒绝策略?(三种AbortPolicy、DiscardPolicy、DiscardOldestPolicy)


7、 execute和submit的区别?(execute适用于不需要关注返回值的场景,只需要将线程丢到线程池中去执行就可以,submit方法适用于需要关注返回值的场景)


8、如何终止线程池?(shutdownNow:对正在执行的任务停止,shutdown:只是不接受新任务)


三、锁系列


1、synchronized的作用、使用、底层原理、常见缺陷?


(从同步角度看作用,从对象锁和类锁角度看使用,可重入性和不可中断性看性质,从反编译字节码的角度看底层原理包含了监控器monitor,缺点是效率低、不够灵活、不知道是否获得了锁。)


2、volatile关键字的作用?(保证可见性有序性,不保证原子性,非线程安全,)


3、什么是活锁、饥饿、无锁、死锁?(死锁是相互占据对方的资源又不释放、活锁是主动释放自己的资源而不使用、饥饿是优先级高的线程一直占据资源,)


4、什么是CAS?(AtomicInteger底层实现,从A,V,B三个角度看,可以从你妈预期你女朋友A,你现在女朋友V,你妈如果看到A==V,那就让你娶B。)


5、什么是AQS?(AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的,

AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。使用了独占式和共享式,底层使用了模板方法模式)


6、什么是乐观锁,什么是悲观锁?有什么区别?


(悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。

乐观锁是每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。atomic


四、线程工具类



1、ThreadLocal是什么?有什么用?


ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。ThreadLocal就是一种以间换时间的做法,在每个Thread里面维护了一个以开地址法实现的ThreadLocal.ThreadLocalMap,把数据进行隔离,数据不共享,自然就没有线程安全方面的问题了。


2、Semaphore有什么作用


Semaphore就是一个信号量,它的作用是限制某段代码块的并发数。Semaphore有一个构造函数,可以传入一个int型整数n,表示某段代码最多只有n个线程可以访问,如果超出了n,那么请等待,等到某个线程执行完毕这段代码块,下一个线程再进入。

3、CountDownLatch?(类似于计数器的方式,用于等待一个或多个线程执行完操作开始自身代码的执行。)


4、CyclicBarrier?(CyclicBarrier即同步屏障,它主要功能是让一组线程达到一个屏障(也可以称为同步点)是被阻塞,直到最后一个线程达到屏障是,屏障才被打开,所有被拦截的线程才会继续执行)


5、Exchanger?(用于线程间的协作工具类,主要用于线程间数据的交换。它提供了一个同步点,在这个同步点,两个线程可以交换彼此的数据)


6、 CyclicBarrier和CountDownLatch的区别?(二者的区别在于:


(1)CyclicBarrier的某个线程运行到某个点上之后,该线程即停止运行,直到所有的线程都到达了这个点,所有线程才重新运行;CountDownLatch则不是,某线程运行到某个点上之后,该线程会继续运行。


(2)CyclicBarrier只能唤起一个任务,CountDownLatch可以唤起多个任务。


(3)CyclicBarrier可重用,CountDownLatch不可重用,计数值为0该CountDownLatch就不可再用了)


线程集合将和java中的类集合一块讨论。如有不完善的地方还请补充。

相关文章
|
7天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
37 6
|
20天前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
|
22天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
54 14
|
15天前
|
安全 算法 Java
Java多线程编程中的陷阱与最佳实践####
本文探讨了Java多线程编程中常见的陷阱,并介绍了如何通过最佳实践来避免这些问题。我们将从基础概念入手,逐步深入到具体的代码示例,帮助开发者更好地理解和应用多线程技术。无论是初学者还是有经验的开发者,都能从中获得有价值的见解和建议。 ####
|
15天前
|
Java 调度
Java中的多线程编程与并发控制
本文深入探讨了Java编程语言中多线程编程的基础知识和并发控制机制。文章首先介绍了多线程的基本概念,包括线程的定义、生命周期以及在Java中创建和管理线程的方法。接着,详细讲解了Java提供的同步机制,如synchronized关键字、wait()和notify()方法等,以及如何通过这些机制实现线程间的协调与通信。最后,本文还讨论了一些常见的并发问题,例如死锁、竞态条件等,并提供了相应的解决策略。
40 3
|
17天前
|
监控 Java 开发者
深入理解Java中的线程池实现原理及其性能优化####
本文旨在揭示Java中线程池的核心工作机制,通过剖析其背后的设计思想与实现细节,为读者提供一份详尽的线程池性能优化指南。不同于传统的技术教程,本文将采用一种互动式探索的方式,带领大家从理论到实践,逐步揭开线程池高效管理线程资源的奥秘。无论你是Java并发编程的初学者,还是寻求性能调优技巧的资深开发者,都能在本文中找到有价值的内容。 ####
|
22天前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
79 6
|
20天前
|
监控 Java 数据库连接
Java线程管理:守护线程与用户线程的区分与应用
在Java多线程编程中,线程可以分为守护线程(Daemon Thread)和用户线程(User Thread)。这两种线程在行为和用途上有着明显的区别,了解它们的差异对于编写高效、稳定的并发程序至关重要。
28 2
|
20天前
|
监控 Java 开发者
Java线程管理:守护线程与本地线程的深入剖析
在Java编程语言中,线程是程序执行的最小单元,它们可以并行执行以提高程序的效率和响应性。Java提供了两种特殊的线程类型:守护线程和本地线程。本文将深入探讨这两种线程的区别,并探讨它们在实际开发中的应用。
27 1
|
21天前
|
安全 Java 开发者
Java中的多线程编程:从基础到实践
本文深入探讨了Java多线程编程的核心概念和实践技巧,旨在帮助读者理解多线程的工作原理,掌握线程的创建、管理和同步机制。通过具体示例和最佳实践,本文展示了如何在Java应用中有效地利用多线程技术,提高程序性能和响应速度。
54 1
下一篇
DataWorks