java面试题2023年及答案.docx

上传人:1513****116 文档编号:94999094 上传时间:2023-08-13 格式:DOCX 页数:10 大小:18.36KB
返回 下载 相关 举报
java面试题2023年及答案.docx_第1页
第1页 / 共10页
java面试题2023年及答案.docx_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《java面试题2023年及答案.docx》由会员分享,可在线阅读,更多相关《java面试题2023年及答案.docx(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、 java面试题2023及答案 1) 什么是线程? 线程是操作系统能够进展运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进展多处理器编程,你可以使用多线程对 运算密集型任务提速。比方,假如一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程供应了卓越的支 持,它也是一个很好的卖点。欲了解更多具体信息请点击这里。 2) 线程和进程有什么区分? 线程是进程的子集,一个进程可以有许多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而全部的线程共享一片一样的内存空间。别把它和栈内存搞混,每个线程都拥有单独的

2、栈内存用来存储本地数据。更多具体信息请点击这里。 3) 如何在Java中实现线程? 在语言层面有两种方式。java。lang。Thread 类的实例就是一个线程但是它需要调用java。lang。Runnable接口来执行,由于线程类本身就是调用的Runnable接口所以你可以继承 java。lang。Thread 类或者直接调用Runnable接口来重写run()方法实现线程。更多具体信息请点击这里。 4) 用Runnable还是Thread? 这个问题是上题的后续,大家都知道我们可以通过继承Thread类或者调用Runnable接口来实现线程,问题是,那个方法更好呢?什么状况下使 用它?这个

3、问题很简单答复,假如你知道Java不支持类的多重继承,但允许你调用多个接口。所以假如你要继承其他类,固然是调用Runnable接口好 了。更多具体信息请点击这里。 6) Thread 类中的start() 和 run() 方法有什么区分? 这个问题常常被问到,但还是能从今区分出面试者对Java线程模型的理解程度。start()方法被用来启动新创立的线程,而且start()内部 调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启 动,start()方法才会启动新线程。更多争论请点击这里 7) Java中Runnab

4、le和Callable有什么不同? Runnable和Callable都代表那些要在不同的线程中执行的任务。Runnable从JDK1。0开头就有了,Callable是在 JDK1。5增加的。它们的主要区分是Callable的 call() 方法可以返回值和抛出特别,而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象。我的博客有更具体的说明。 8) Java中CyclicBarrier 和 CountDownLatch有什么不同? CyclicBarrier 和 CountDownLatch 都可以用来让一组线程等待其它线程。与 Cycli

5、cBarrier 不同的是,CountdownLatch 不能重新使用。点此查看更多信息和例如代码。 9) Java内存模型是什么? Java内存模型规定和指引Java程序在不同的内存架构、CPU和操作系统间有确定性地行为。它在多线程的状况下尤其重要。Java内存模型对一 个线程所做的变动能被其它线程可见供应了保证,它们之间是先行发生了关系。这个关系定义了一些规章让程序员在并发编程时思路更清楚。比方,先行发生了关系确保 了: 线程内的代码能够按先后挨次执行,这被称为程序次序规章。 对于同一个锁,一个解锁操作肯定要发生在时间上后发生的另一个锁定操作之前,也叫做管程锁定规章。 前一个对volati

6、le的写操作在后一个volatile的读操作之前,也叫volatile变量规章。 一个线程内的任何操作必需在这个线程的start()调用之后,也叫作线程启动规章。 一个线程的全部操作都会在线程终止之前,线程终止规章。 一个对象的终结操作必需在这个对象构造完成之后,也叫对象终结规章。 可传递性 我剧烈建议大家阅读Java并发编程实践第十六章来加深对Java内存模型的理解。 10) Java中的volatile 变量是什么? volatile是一个特别的修饰符,只有成员变量才能使用它。在Java并发程序缺少同步类的状况下,多线程对成员变量的操作对其它线程是透亮的。volatile变量可以保证下一个

7、读取操作会在前一个写操作之后发生,就是上一题的volatile变量规章。点击这里查看更多volatile的相关内容。 11) 什么是线程安全?Vector是一个线程安全类吗? (详见这里) 假如你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。假如每次运行结果和单线程运行的结果是一样的,而且其他的变量 的值也和预期的是一样的,就是线程安全的。一个线程安全的计数器类的同一个实例对象在被多个线程使用的状况下也不会消失计算失误。很明显你可以将集合类分 成两组,线程安全和非线程安全的。Vector 是用同步方法来实现线程安全的, 而和它相像的ArrayList不是线程安全的。

8、 12) Java中什么是竞态条件? 举个例子说明。 竞态条件会导致程序在并发状况下消失一些bugs。多线程对一些资源的竞争的时候就会产生竞态条件,假如首先要执行的程序竞争失败排到后面执行了, 那么整个程序就会消失一些不确定的bugs。这种bugs很难发觉而且会重复消失,由于线程间的随机竞争。一个例子就是无序处理,详见答案。 13) Java中如何停顿一个线程? Java供应了很丰富的API但没有为停顿线程供应API。JDK 1。0原来有一些像stop(), suspend() 和 resume()的掌握方法但是由于潜在的死锁威逼因此在后续的JDK版本中他们被弃用了,之后Java API的设计

9、者就没有供应一个兼容且线程安全的方法来停顿一个线程。当run() 或者 call() 方法执行完的时候线程会自动完毕,假如要手动完毕一个线程,你可以用volatile 布尔变量来退出run()方法的循环或者是取消任务来中断线程。点击这里查看例如代码。 14) 一个线程运行时发生特别会怎样? 这是我在一次面试中遇到的一个很刁钻的Java面试题, 简洁的说,假如特别没有被捕获该线程将会停顿执行。Thread。UncaughtExceptionHandler是用于处理未捕获特别造成线程突然中 断状况的一个内嵌接口。当一个未捕获特别将造成线程中断的时候JVM会使用Thread。getUncaughtE

10、xceptionHandler()来 查询线程的UncaughtExceptionHandler并将线程和特别作为参数传递给handler的uncaughtException()方法 进展处理。 15) 如何在两个线程间共享数据? 你可以通过共享对象来实现这个目的,或者是使用像堵塞队列这样并发的数据构造。这篇教程Java线程间通信(涉及到在两个线程间共享对象)用wait和notify方法实现了生产者消费者模型。 16) Java中notify 和 notifyAll有什么区分? 这又是一个刁钻的问题,由于多线程可以等待单监控锁,Java API 的设计人员供应了一些方法当等待条件转变的时候通知

11、它们,但是这些方法没有完全实现。notify()方法不能唤醒某个详细的线程,所以只有一个线程在等 待的时候它才有用武之地。而notifyAll()唤醒全部线程并允许他们争夺锁确保了至少有一个线程能连续运行。我的博客有更具体的资料和例如代码。 17) 为什么wait, notify 和 notifyAll这些方法不在thread类里面? 这是个设计相关的问题,它考察的是面试者对现有系统和一些普遍存在但看起来不合理的事物的看法。答复这些问题的.时候,你要说明为什么把这些方法放在 Object类里是有意义的,还有不把它放在Thread类里的缘由。一个很明显的缘由是JAVA供应的锁是对象级的而不是线程

12、级的,每个对象都有锁,通 过线程获得。假如线程需要等待某些锁那么调用对象中的wait()方法就有意义了。假如wait()方法定义在Thread类中,线程正在等待的是哪个锁 就不明显了。简洁的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中由于锁属于对象。你也可以查 看这篇文章了解更多。 18) 什么是ThreadLocal变量? ThreadLocal是Java里一种特别的变量。每个线程都有一个ThreadLocal就是每个线程都拥有了自己独立的一个变量,竞争条件被 彻底消退了。它是为创立代价昂扬的对象猎取线程安全的好方法,比方你可以用Thr

13、eadLocal让SimpleDateFormat变成线程安全的,因 为那个类创立代价昂扬且每次调用都需要创立不同的实例所以不值得在局部范围使用它,假如为每个线程供应一个自己独有的变量拷贝,将大大提高效率。首先,通 过复用削减了代价昂扬的对象的创立个数。其次,你在没有使用高代价的同步或者不变性的状况下获得了线程安全。线程局部变量的另一个不错的例子是 ThreadLocalRandom类,它在多线程环境中削减了创立代价昂扬的Random对象的个数。查看答案了解更多。 19) 什么是FutureTask? 在Java并发程序中FutureTask表示一个可以取消的异步运算。它有启动和取消运算、查询

14、运算是否完成和取回运算结果等方法。只有当运算完 成的时候结果才能取回,假如运算尚未完成get方法将会堵塞。一个FutureTask对象可以对调用了Callable和Runnable的对象进展包 装,由于FutureTask也是调用了Runnable接口所以它可以提交给Executor来执行。 20) Java中interrupted 和 isInterruptedd方法的区分? interrupted() 和 isInterrupted()的主要区分是前者会将中断状态去除而后者不会。Java多线程的中断机制是用内部标识来实现的,调用Thread。interrupt()来中断一个线程就会设置中断

15、标识为true。当中断线程调用静态方法Thread。interrupted()来 检查中断状态时,中断状态会被清零。而非静态方法isInterrupted()用来查询其它线程的中断状态且不会转变中断状态标识。简洁的说就是任何抛 出InterruptedException特别的方法都会将中断状态清零。无论如何,一个线程的中断状态有有可能被其它线程调用中断来转变。 21) 为什么wait和notify方法要在同步块中调用? 主要是由于Java API强制要求这样做,假如你不这么做,你的代码会抛出IllegalMonitorStateException特别。还有一个缘由是为了避开wait和notif

16、y之间产生竞态条件。 22) 为什么你应当在循环中检查等待条件? 处于等待状态的线程可能会收到错误警报和伪唤醒,假如不在循环中检查等待条件,程序就会在没有满意完毕条件的状况下退出。因此,当一个等待线程醒来 时,不能认为它原来的等待状态仍旧是有效的,在notify()方法调用之后和等待线程醒来之前这段时间它可能会转变。这就是在循环中使用wait()方 法效果更好的缘由,你可以在Eclipse中创立模板调用wait和notify试一试。假如你想了解更多关于这个问题的内容,我推举你阅读Effective Java这本书中的线程和同步章节。 23) Java中的同步集合与并发集合有什么区分? 同步集合

17、与并发集合都为多线程和并发供应了适宜的线程安全的集合,不过并发集合的可扩展性更高。在Java1。5之前程序员们只有同步集合来用且在 多线程并发的时候会导致争用,阻碍了系统的扩展性。Java5介绍了并发集合像ConcurrentHashMap,不仅供应线程安全还用锁分别和内局部 区等现代技术提高了可扩展性。更多内容详见答案。 24) Java中堆和栈有什么不同? 为什么把这个问题归类在多线程和并发面试题里?由于栈是一块和线程严密相关的内存区域。每个线程都有自己的栈内存,用于存储本地变量,方法参数和栈 调用,一个线程中存储的变量对其它线程是不行见的。而堆是全部线程共享的一片公用内存区域。对象都在堆

18、里创立,为了提升效率线程会从堆中弄一个缓存到自己 的栈,假如多个线程使用该变量就可能引发问题,这时volatile 变量就可以发挥作用了,它要求线程从主存中读取变量的值。 25) 什么是线程池? 为什么要使用它? 创立线程要花费昂贵的资源和时间,假如任务来了才创立线程那么响应时间会变长,而且一个进程能创立的线程数有限。为了避开这些问题,在程序启动的时 候就创立若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从JDK1。5开头,Java API供应了Executor框架让你可以创立不同的线程池。比方单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合许多生存期短 的任务的程序的可扩展线程池)。更多内容详见这篇文章。 26) 如何写代码来解决生产者消费者问题? 在现实中你解决的很多线程问题都属于生产者消费者模型,就是一个线程生产任务供其它线程进展消费,你必需知道怎么进展线程间通信来解决这个问题。比 较低级的方法是用wait和notify来解决这个问题,比拟赞的方法是用Semaphore 或者 BlockingQueue来实现生产者消费者模型,这篇教程有实现它。 【java面试题2023及答案】

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁