当前位置: 首页 > news >正文

java 多线程面试题

0、Java中多线程同步是什么?

在多线程程序下,同步能控制对共享资源的访问。如果没有同步,当一个Java线程在修改一个共享变量时,另外一个线程正在使用或者更新同一个变量,这样容易导致程序出现错误的结果。

1、解释实现多线程的几种方法?

Java线程可以实现Runnable接口或者继承Thread类来实现,当你打算多重继承时,优先选择实现Runnable。还可以使用线程池。

2、Thread.start()与Thread.run()有什么区别?

Thread.start()方法(native)启动线程,使之进入就绪状态,当cpu分配时间该线程时,由JVM调度执行run()方法。

3、为什么需要run()和start()方法,我们可以只用run()方法来完成任务吗?

我们需要run()&start()这两个方法是因为JVM创建一个单独的线程不同于普通方法的调用, 所以这项工作由线程的start方法来完成,start由本地方法实现,需要显示地被调用,使用这俩个方法的另外一个好处是任何一个对象都可以作为线程运 行,只要实现了Runnable接口,这就避免因继承了Thread类而造成的Java的多继承问题。

4、什么是ThreadLocal类,怎么使用它?

ThreadLocal是一个线程级别的局部变量,并非“本地线程”。ThreadLocal为每个使用该变量的线程提供了一个独立的变量副本,每个线程修改副本时不影响其它线程对象的副本(译者注)。

5、Sleep()、suspend()和wait()之间有什么区别?

Thread.sleep()使当前线程在指定的时间处于“非运行”(Not Runnable)状态。线程一直持有对象的监视器。比如一个线程当前在一个同步块或同步方法中,其它线程不能进入该块或方法中。如果另一线程调用了 interrupt()方法,它将唤醒那个“睡眠的”线程。

注意:sleep()是一个静态方法。这意味着只对当前线程有效,一个常见的错误是调用t.sleep(),(这里的t是一个不同于当前线程的线 程)。即便是执行t.sleep(),也是当前线程进入睡眠,而不是t线程。t.suspend()是过时的方法,使用suspend()导致线程进入停 滞状态,该线程会一直持有对象的监视器,suspend()容易引起死锁问题。

object.wait()使当前线程出于“不可运行”状态,和sleep()不同的是wait是object的方法而不是thread。调用 object.wait()时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另一线程可以同步同一个 对象锁来调用object.notify(),这样将唤醒原来等待中的线程,然后释放该锁。基本上wait()/notify()与sleep() /interrupt()类似,只是前者需要获取对象锁。

6、在静态方法上使用同步时会发生什么事?

同步静态方法时会获取该类的“Class”对象,所以当一个线程进入同步的静态方法中时,线程监视器获取类本身的对象锁,其它线程不能进入这个类的任何静态同步方法。它不像实例方法,因为多个线程可以同时访问不同实例同步实例方法。

7、当一个同步方法已经执行,线程能够调用对象上的非同步实例方法吗?

可以,一个非同步方法总是可以被调用而不会有任何问题。实际上,Java没有为非同步方法做任何检查,锁对象仅 仅在同步方法或者同步代码块中检查。如果一个方法没有声明为同步,即使你在使用共享数据Java照样会调用,而不会做检查是否安全,所以在这种情况下要特 别小心。一个方法是否声明为同步取决于临界区访问(critial section access),如果方法不访问临界区(共享资源或者数据结构)就没必要声明为同步的。

8、 在一个对象上两个线程可以调用两个不同的同步实例方法吗?

不能,因为一个对象已经同步了实例方法,线程获取了对象的对象锁。所以只有执行完该方法释放对象锁后才能执行其 它同步方法。看下面代码示例非常清晰:Common 类 有synchronizedMethod1()和synchronizedMethod2()方法,MyThread调用这两个方法。

10、 什么是死锁

死锁就是两个或两个以上的线程被无限的阻塞,线程之间相互等待所需资源。这种情况可能发生在当两个线程尝试获取其它资源的锁,而每个线程又陷入无限等待其它资源锁的释放,除非一个用户进程被终止。

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

使用join()方法

12、在Java中Lock接口比synchronized块的优势是什么?

主要相同点:Lock能完成synchronized所实现的所有功能

主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

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

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

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

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

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

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

 

转载于:https://www.cnblogs.com/Jixiangwei/p/6822334.html

相关文章:

  • 第一阶段冲刺第七天
  • 【bzoj3831】[Poi2014]Little Bird 单调队列优化dp
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • bzoj4034: [HAOI2015]树上操作(树链剖分)
  • Leetcode 记录(1~100)
  • ArcGIS Server缓存清理
  • vmware和centos的安装
  • Vue.js中滚动条加载更多数据
  • 如何一键收藏微信文章?
  • 【Linux】【Services】【Project】Haproxy Keepalived Postfix实现邮件网关Cluster
  • 10.2.1 关于vc++不支持把类的成员函数定义为类的友元函数的处理
  • OC 手势可能出现的问题
  • Excel常用12个公式
  • Python web 框架:web.py
  • 【智能家居篇】通信技术简单介绍
  • 《剑指offer》分解让复杂问题更简单
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • codis proxy处理流程
  • JS基础之数据类型、对象、原型、原型链、继承
  • mysql外键的使用
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Redis 中的布隆过滤器
  • scala基础语法(二)
  • V4L2视频输入框架概述
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 算法-图和图算法
  • 网页视频流m3u8/ts视频下载
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 智能合约开发环境搭建及Hello World合约
  • 转载:[译] 内容加速黑科技趣谈
  • Python 之网络式编程
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (10)ATF MMU转换表
  • (pojstep1.3.1)1017(构造法模拟)
  • (SpringBoot)第二章:Spring创建和使用
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (五)关系数据库标准语言SQL
  • (转)ABI是什么
  • (转载)利用webkit抓取动态网页和链接
  • *** 2003
  • .equals()到底是什么意思?
  • .gitignore文件—git忽略文件
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • @RestControllerAdvice异常统一处理类失效原因
  • @Validated和@Valid校验参数区别
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [] 与 [[]], -gt 与 > 的比较
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [BIZ] - 1.金融交易系统特点
  • [c]统计数字
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例