15个顶级Java多线程面试题及答案

转载自  15个顶级Java多线程面试题及答案

在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得更多职位,那么你应该准备很多关于多线程的问题。

他们会问面试者很多令人混淆的Java线程问题。面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面。现在引用Java5并发包关于并发工具和并发集合的问题正在增多。那些问题中ThreadLocal、Blocking Queue、Counting Semaphore和ConcurrentHashMap比较流行。 

 

15个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。关于这方面最好的书是《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线程问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio 15.5预览版先睹为快

Microsoft延续了Visual Studio 2017快速迭代开发的步伐,最新发布了15.5预览版,这是VS2017这一广受欢迎的IDE自发布以来的第五次更新,该预览版的发布使用户可以先睹为快。 该预览版启用了一个称为“Stepping Back”的调试历史新特性。IntelliT…

C++描述杭电OJ 2017.字符串统计||

C描述杭电OJ 2017.字符串统计|| Problem Description 对于给定的一个字符串,统计其中数字字符出现的次数。 Input 输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成…

【Android】实现页面跳转

对比html&#xff0c;安卓的页面跳转要难的多。 html只需要一个a标签即可实现页面的跳转&#xff0c;而安卓要分三步走 第一步 在activity_main.xml创建一个按钮 <Buttonandroid:id"id/btn1"android:layout_width"match_parent"android:layout_heigh…

jzoj100046-收集卡片【暴力】

正题 题目大意 给一个字符串&#xff0c;求一个最短的子串包含所有在这个字符串里出现的字母。 解题思路 枚举右指针&#xff0c;左指针移动到刚好满足要求的位置。每次就一个最小值。 时间复杂度:O(56n)O(56n)O(56n) code #include<cstdio> #include<algorithm>…

C++描述杭电OJ 2019. 数列有序 ||

C描述杭电OJ 2019. 数列有序 || Problem Description 有n(n<100)个整数&#xff0c;已经按照从小到大顺序排列好&#xff0c;现在另外给一个整数x&#xff0c;请将该数插入到序列中&#xff0c;并使新的序列仍然有序。 Input 输入数据包含多个测试实例&#xff0c;每组数…

【Android布局】控件布置

居中对齐 在相对布局中简单点 RelativeLayout 水平居中&#xff1a;android:layout_centerHorizontal“true” 垂直居中&#xff1a;android:layout_centerVertical“true” 水平垂直居中&#xff1a;android:layout_centerInParent“true” 在线性布局中 LinearLayout 首先必…

jzoj100047-基因变异【位运算,bfs】

正题 题目大意 一个长度为nnn的序列aaa。 对于一个数每秒可以将一个二进制位取反或异或aaa中的一个数。 qqq个询问&#xff0c;询问从xxx变化到yyy最少要多少秒。 解题思路 对于一个x和yx和yx和y&#xff0c;设 xxorwyx\ xor\ wyx xor wy ⇒xyxorw\Rightarrow xy\ xor\ w⇒xy…

写一个算法统计在输入字符串中各个字符出现的频度

#include<bits/stdc.h> using namespace std;void fun() {int a[62]{0} ;char c;cout<<"请输入一个字符串&#xff0c;以#结尾:";cin>>c;while(c!#){if(c>A&&c<Z) a[c-A];else if(c>a&&c<z) a[c-a26];else a[c-052];c…

ABP从入门到精通(3):aspnet-zero-core 使用Redis缓存

一.Redis是什么&#xff1f; redis是一个key-value存储系统。和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash&#xff08;哈希类型&#xff09;。这些数据类型都支持pus…

【Mysql】win10上Mysq的l安装

最近想学习java的jdbc&#xff0c;完成注册登录系统&#xff0c;有了php的经验&#xff0c;&#xff0c;就简单多。但是php是基于wamp集成环境的&#xff0c;当时就是由于win10安装mysql老是错误&#xff0c;所以选择了集成环境&#xff0c;这对入门来讲降低了很大的难度。这次…

jzoj100044-abcd【多重背包,二进制压缩,dp】

正题 题目大意 给出长度为nnn的序列a,b,c,da,b,c,da,b,c,d 求一个序列eee满足 (∑i1nei∗ci)0(e∈[ai..bi])(\sum _{i1}^ne_i*c_i)0(e\in [a_i..b_i])(i1∑n​ei​∗ci​)0(e∈[ai​..bi​]) 求 max{∑i1nei∗di}max\{\sum_{i1}^ne_i*d_i\}max{i1∑n​ei​∗di​} 解题思路 我…

MySQL主从数据库配置和常见问题

转载自 MySQL主从数据库配置和常见问题 本篇主要介绍MySQL的主从数据配置方法。公司运维能力不是太好&#xff0c;数据库最近出了一次问题&#xff0c;导致丢失了一天的数据&#xff0c;并且某个服务宕机一晚上。为了避免再次出现类似问题&#xff0c;我决定添加一个Slave服务…

试编写算法,设任意n个整数存放于数组A[1...n]中,将所有正数排在所有负数前面(要求:算法时间复杂度为O(n))

#include<bits/stdc.h> using namespace std;int main() {int n,*a,t;cout<<"请输入数组长度&#xff1a;";cin>>n;anew int [n];cout<<"请输入数组元素&#xff1a;";for(int i0; i<n; i) cin>>a[i];int i0,jn-1;while(…

Entity Framework Core 2.0 使用代码进行自动迁移

一.前言 我们在使用EF进行开发的时候&#xff0c;肯定会遇到将迁移更新到生产数据库这个问题&#xff0c;前面写了一篇文章介绍了Entity Framework Core 2.0的入门使用&#xff0c;这里面介绍了使用命令生成迁移所需的SQL&#xff0c;然后更新到生产数据库的方法。这里还有另一…

【JDBC】各版本jar包下载网址及Tomcat下载

http://central.maven.org/maven2/mysql/mysql-connector-java/ 自己的mysql的版本号会在登录之后显示 Tomcat链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bOMY_6hp7nV5KpU496YPlA 提取码&#xff1a;rerg

欢乐纪中某B组赛【2018.12.15】

前言 题目还好&#xff0c;都是装作很难&#xff0c;其实都不考高深算法。 某位A组dalao来水了个AK。 而且题号都很诡异 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC3332017myself2017myself2017myself22022022010010010010010010…

Mybatis中强大的功能元素:resultMap

转载自 Mybatis中强大的功能元素&#xff1a;resultMap 前言 在Mybatis中&#xff0c;有一个强大的功能元素resultMap。当我们希望将JDBC ResultSets中的数据&#xff0c;转化为合理的Java对象时&#xff0c;你就能感受到它的非凡之处。正如其官方所述的那样&#xff1a; re…

将编号为0和1的两个栈存放于一个数组空间V[m]中。

目录 1.题目描述 2.算法实现 1.题目描述 将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空&#xff1b;当第1号栈的栈顶指针top[1]等于m时该栈为空。两个栈均从两端向中间增长&#xff08;见图&#xff09;…

【JDBC】Eclipse连接Mysql

学习完servlet终于可以学习JDBC了&#xff0c;下载安装完mysql&#xff0c;导入jar包后&#xff0c;就可以利用java对mysql进行一系列的操作了 连接数据库并插入数据的代码 package com.k1998;import java.sql.Connection; import java.sql.Driver; import java.sql.DriverMa…

ASP.NET Core 2.0 依赖注入

问题 如何使用 ASP.NET Core 服务容器进行依赖注入&#xff1f; 答案 创建一个服务 public interface IGreetingService { string Greet(string to); } public class GreetingService : IGreetingService { public string Greet(string to){ return $"H…