高级Java多线程面试题及回答

 

  高级Java多线程面试题及回答

  1)现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?

  这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉。这个多线程问题比较简单,可以用join方法实现。

  2)在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?

  lock接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,它能满足你写像ConcurrentHashMap这样的高性能数据结构和有条件的阻塞。Java线程面试的问题越来越会根据面试者的回答来提问。我强烈建议在你去参加多线程的面试之前认真读一下Locks,因为当前其大量用于构建电子交易终统的客户端缓存和交易连接空间。

  3)在java中wait和sleep方法的不同?

  通常会在电话面试中经常被问到的Java线程面试问题。最大的不同是在等待时wait会释放锁,而sleep一直持有锁。Wait通常被用于线程间交互,sleep通常被用于暂停执行。

  4)用Java实现阻塞队列。

  这是一个相对艰难的多线程面试问题,它能达到很多的目的。第一,它可以检测侯选者是否能实际的用Java线程写程序;第二,可以检测侯选者对并发场景的理解,并且你可以根据这个问很多问题。如果他用wait()和notify()方法来实现阻塞队列,你可以要求他用最新的Java 5中的并发类来再写一次。

  5)用Java写代码来解决生产者——消费者问题。

  与上面的问题很类似,但这个问题更经典,有些时候面试都会问下面的问题。在Java中怎么解决生产者——消费者问题,当然有很多解决方法,我已经分享了一种用阻塞队列实现的方法。有些时候他们甚至会问怎么实现哲学家进餐问题。

  6)用Java编程一个会导致死锁的程序,你将怎么解决?

  这是我最喜欢的Java线程面试问题,因为即使死锁问题在写多线程并发程序时非常普遍,但是很多侯选者并不能写deadlock free code(无死锁代码?),他们很挣扎。只要告诉他们,你有N个资源和N个线程,并且你需要所有的资源来完成一个操作。为了简单这里的n可以替换为2,越大的数据会使问题看起来更复杂。通过避免Java中的死锁来得到关于死锁的更多信息。

  7) 什么是原子操作,Java中的原子操作是什么?

  非常简单的java线程面试问题,接下来的问题是你需要同步一个原子操作。

  8) Java中的volatile关键是什么作用?怎样使用它?在Java中它跟synchronized方法有什么不同?

  自从Java 5和Java内存模型改变以后,基于volatile关键字的线程问题越来越流行。应该准备好回答关于volatile变量怎样在并发环境中确保可见性、顺序性和一致性。

  9) 什么是竞争条件?你怎样发现和解决竞争?

  这是一道出现在多线程面试的高级阶段的问题。大多数的面试官会问最近你遇到的竞争条件,以及你是怎么解决的。有些时间他们会写简单的代码,然后让你检测出代码的竞争条件。可以参考我之前发布的关于Java竞争条件的文章。在我看来这是最好的java线程面试问题之一,它可以确切的检测候选者解决竞争条件的经验,or writing code which is free of data race or any other race condition(这句which is free of data race不会翻译)。关于这方面最好的书是《Concurrency practices in Java》。

  10) 你将如何使用thread dump?你将如何分析Thread dump?

  在UNIX中你可以使用kill -3,然后thread dump将会打印日志,在windows中你可以使用”CTRL+Break”。非常简单和专业的线程面试问题,但是如果他问你怎样分析它,就会很棘手。

  11) 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?

  这是另一个非常经典的java多线程面试问题。这也是我刚开始写线程程序时候的困惑。现在这个问题通常在电话面试或者是在初中级Java面试的第一轮被问到。这个问题的回答应该是这样的,当你调用start()方法时你将创建新的线程,并且执行在run()方法里的代码。但是如果你直接调用run()方法,它不会创建新的线程也不会执行调用线程的代码。阅读我之前写的《start与run方法的区别》这篇文章来获得更多信息。

  12) Java中你怎样唤醒一个阻塞的线程?

  这是个关于线程和阻塞的棘手的问题,它有很多解决方法。如果线程遇到了IO阻塞,我并且不认为有一种方法可以中止线程。如果线程因为调用wait()、sleep()、或者join()方法而导致的阻塞,你可以中断线程,并且通过抛出InterruptedException来唤醒它。我之前写的《How to deal with blocking methods in java》有很多关于处理线程阻塞的信息。

  13)在Java中CycliBarriar和CountdownLatch有什么区别?

  这个线程问题主要用来检测你是否熟悉JDK5中的并发包。这两个的区别是CyclicBarrier可以重复使用已经通过的障碍,而CountdownLatch不能重复使用。

  14) 什么是不可变对象,它对写并发应用有什么帮助?

  另一个多线程经典面试问题,并不直接跟线程有关,但间接帮助很多。这个java面试问题可以变的非常棘手,如果他要求你写一个不可变对象,或者问你为什么String是不可变的。

  15) 你在多线程环境中遇到的共同的问题是什么?你是怎么解决它的?

  多线程和并发程序中常遇到的有Memory-interface、竞争条件、死锁、活锁和饥饿。问题是没有止境的,如果你弄错了,将很难发现和调试。这是大多数基于面试的,而不是基于实际应用的Java线程问题。

  补充的其它几个问题:

  1) 在java中绿色线程和本地线程区别?

  2) 线程与进程的区别?

  3) 什么是多线程中的上下文切换?

  4)死锁与活锁的区别,死锁与馅饼的区别?

  5) Java中用到的线程调度算法是什么?

  6) 在Java中什么是线程调度?

  7) 在线程中你怎么处理不可捕捉异常?

  8) 什么是线程组,为什么在Java中不推荐使用?

  9) 为什么使用Executor框架比使用应用创建和管理线程好?

  10) 在Java中Executor和Executors的区别?

  11) 如何在Windows和Linux上查找哪个线程使用的CPU时间最长?

  java编程语言扩展阅读

  Java编程语言

  我对进程、线程的了解,主要是学生时代看过的`一本大概叫做“C++面象对象多线程编程”的书,是美国人写的。后来学Java编程语言,一直是马马虎虎,以完成任务为目标,没有像学C++那样打实基础(C++的基础也忘差不多了,汗)。这不做东西时又碰到麻烦,经过排查解决,有几个简单知识点做一下笔记。

  第一个是run()与start()。

  翻翻以前自己写的代码,是用start()启动线程的,这次居然犯糊涂用run()来跑,不出错才怪呢。相信有不少Java编程语言程序员像我一样,在不懂的时候,就按个点,查看方法列表,跟据方法名想当然地理解。这种方法可以快速入手做东西,但像多线程这类的东西,还是需要打牢基础,不然麻烦多多。

  run()只是一个普通方法,是Runnable接口定义的,用来执行线程最终要做的事情的方法,它本身没有特别之处,就像main方法一样,启动一个线程后,run()方法会被调用。所以,run()方法没有创建多线程,run()方法里的东西还在调用者线程里跑。

  start()方法是Thread类定义的,它是真正负责启动一个线程的。调用此方法后,将会从线程创建一个新的线程出来(强调从当前线程创建新线程是因为一些属性比如daemon会被继承),然后在新线程执行run()方法。

  第二个就是InterruptedException。

  典型地,我们在run()方法中常用while循环,并且每次循环通常有Thread.sleep(long)调用,这个sleep(long)方法会抛出InterruptedException。之前对这个异常的理解有误,以为这是个“错误”,其实这只是表示一个状态。看官方文档有点拗口,简单地说,这个异常被抛出表示线程收到中断请求(你也可以理解为线程正在被终止,通常是这样,但不绝对。

  为了线程安全、保证数据的一致性,Java编程语言提倡用温和手断中止线程,温和的意思就是run()方法里的代码有机会决定什么时候退出),比如外部调用interrupt()来中断此线程。sleep()收到中断异常意味着sleep时外部发来了中断请求信号,这时如果没有需要善后的操作,就可以退出while循环,结束线程了。

  我以前的代码是catch掉打一句日志,虽然正常工作了,但是却是错误的。

  第三个是Thread.interrupted()和thread.isInterrupted()的区别(后者thread代表Thread的一个实例)。

  两者都返回线程的当前状态,区别在于前者返回当前状态后,会复会这个状态。比如Thread.interrupted()得了true,但此后线程状态被立即置为了false。如果不想改变这一状态,可以用isInterrupted(),比如Thread.currentThread.isInterrupted()。

  还有就是中断状态是会被一些操作改变的,所以不能只用此状态来断段线程是否要退出。线程应该另外设置一个退出标记(如果需要控制线程的运行与否的话)。

  Java高级开发工程师岗位的工作职责说明

  职责:

  1.负责公司产品研发,代码编写及评审。

  2.负责系统框架的搭建及系统调优。

  3.负责需求调研、可行性分析和需求分析,撰写相关的技术文档。

  4.产品上线后,配合运维团队保障平台的稳定,解决相关技术问题。

  5.协助并完成其他各类技术开发任务。

  6.带领团队解决问题,并对初中级开发进行指导。

  任职要求:

  1.本科及以上学历,计算机相关专业,5年以上相关工作经验。

  2.熟悉主流的Java开发框架如Spring, SpringMVC, Mybatis,SpringBoot,SpringCloud等。

  3.了解 Kafka Redis等。

  4.掌握数据库相关知识,熟悉Oracle数据库,能熟练运用SQL语言,具备一定的SQL调优经验。

  5.熟悉Linux系统,熟悉SVN、GIT等代码版本管理工具,熟悉Maven等项目工具。

  6.熟练使用redis 缓存,熟悉搜索引擎Solr或elasticsearch。

  7.具有技术文档编写的能力。

  8.熟悉Linux、Tomcat,Apache,Nginx等开源的服务器和Web服务中间件。

  9.基本功扎实,逻辑思维严谨,善于独立思考,乐于分享,良好的协作意识及团队精神。

经典Java基础面试题回答

  经典Java基础面试题回答

  1、GregorianCalendar类是什么东西?

  GregorianCalendar提供了西方传统日历的支持。

  2、ResourceBundle类是什么?

  ResourceBundle用来存储指定语言环境的资源,应用程序可以根据运行时的语言环境来加载这些资源,从而提供不同语言的展示。

  3、为什么Java里没有全局变量?

  全局变量是全局可见的,Java不支持全局可见的.变量,因为:全局变量破坏了引用透明性原则。全局变量导致了命名空间的冲突。

  4、如何将String类型转化成Number类型?

  Integer类的valueOf方法可以将String转成Number。

  5、SimpleTimeZone类是什么?

  SimpleTimeZone提供公历日期支持。

  6、while循环和do循环有什么不同?

  while结构在循环的开始判断下一个迭代是否应该继续。do/while结构在循环的结尾来判断是否将继续下一轮迭代。do结构至少会执行一次循环体。

  7、Locale类是什么?

  Locale类用来根据语言环境来动态调整程序的输出。

  8、面向对象编程的原则是什么?

  主要有三点,多态,继承和封装。

  9、介绍下继承的原则

  继承使得一个对象可以获取另一个对象的属性。使用继承可以让已经测试完备的功能得以复用,并且可以一次修改,所有继承的地方都同时生效。

  10、什么是隐式的类型转化?

  隐式的类型转化就是简单的一个类型赋值给另一个类型,没有显式的告诉编译器发生了转化。并不是所有的类型都支持隐式的类型转化。

  面试自我介绍范文

  各位考官好,今天能够站在这里参加面试,有机会向各位考官请教和学习,我感到非常的荣幸。希望通过这次面试能够把自己展示给大家,希望大家记住我。我叫---,今年--岁。汉族,法学本科。我平时喜欢看书和上网浏览信息。我的性格比较开朗,随和。能关系周围的任何事,和亲人朋友能够和睦相处,并且对生活充满了信心。我以前在检察院实习过,所以有一定的实践经验。在外地求学的四年中,我养成了坚强的性格,这种性格使我克服了学习和生活中的一些困难,积极进去。成为一名法律工作者是我多年以来的强烈愿望。

  如果我有机会被录用的话,我想,我一定能够在工作中得到锻炼并实现自身的价值。同时,我也认识到,人和工作的关系是建立在自我认知的基础上的,我认为我有能力也有信心做好这份工作。

  公务员是一个神圣而高尚的职业,它追求的是公共利益的最大化,它存在的根本目的是为人民服务,为国家服务。雷锋说过:人的生命是有限的,而为人民服务是无限的,我要把有限的生命投入到无限的为人民服务当中去。这也是我对公务员认知的最好诠释。所以,这份工作能够实现我的社会理想和人生价值,希望大家能够认可我,给我这个机会!

  面试前的准备

  首先,你得对自己做出一个正确的定位。选择一个适合自己的行业,而不是适合自己专业的行业。多和他人交流,听取他们的.意见,最后结合自己的性格特征,兴趣取向等方面,搞清楚自己能做什么?要做什么?想清楚了就去准备,去做。永远不要忘记“机会总是留给那些准备好的人的”。

  其次,通过各种渠道查找有关用人单位的信息,包括公司的主要产品、经营项目、管理方式,以及他们期望职工在这个特定的岗位上应该具有的素质。这对你在面试时应对面试官的提问会很有帮助的。必要时还可以提前去一次面试地点,以熟悉环境,你甚至要搞清楚厕所的方位。

  第三,设计良好的个人形象。我给的建议是着装最好与用人单位尽量保持一致或相似,以给对方一种亲切感,让面试官觉得你是他们的一份子,你想成为他们的一份子。如果这方面有困难的话,也可以按以下建议着装,最终目的都是要展示自己的精神面貌,给用人单位留下一个良好的印象。

  一)男士可以穿西装,以毛料的深蓝色西装为宜,全身颜色最好不要超过三种,可以配一双黑色皮鞋、一双深色袜子和一条领带。西装要平整、清洁、有裤线;西装口袋不放任何东西;必需拆除西装商标。面试前应理发、修指甲、刮胡子、去鼻毛,务必处理好这些细节。另外面试当天记得洗两次脸,稍稍用些护发、护肤品,以淡雅的香气为佳;西装上也可以适当喷些香水,最好是前一天晚上就喷好,保证不要太刺鼻,否则会让面试官感到不舒服。无论是护发、护肤品,还是香水务必保持气味一致。

  二)女士可以穿正规套装、套裙,也应遵守三色原则。套裙最好不要高过膝盖三厘米,穿丝袜,配一双系带皮鞋,不宜穿高跟鞋。可以配一个小巧耳环或胸针,切忌有太多的饰物。做到大方、得体。发型文雅、庄重、梳理整齐、长发最好用发夹夹好,不能染鲜艳的颜色。化淡装,不留长指甲,最好涂自然色的指甲油。

  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值