多线程:Simultaneous Multithreading,简称SMT。

并行、并发

并行性(parallelism)指两个或两个以上的事件在同一时刻发生,在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。

并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,谈论并发的时候一定要加个单位时间,也就是说单位时间内并发量是多少,并发性是对有限物理资源强制行使多用户共享以提高效率,离开了单位时间其实是没有意义的。

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

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

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

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

Sleep()、wait()

Java程序中wait 和 sleep都会造成某种形式的暂停,它们可以满足不同的需要。

sleep()是一个静态方法,只对当前线程有效,一个常见的错误是调用t.sleep()(注:这里的t是一个不同于当前线程的线程)。

wait()方法用于线程间通信,和sleep()不同的是wait()是Object的方法,object.wait()使当前线程处于“不可运行”状态。调用wait()方法时,线程先要获取这个对象的对象锁,当前线程必须对锁对象保持同步,当前线程被添加到等待队列中,随后另一线程可以同步同一个对象锁来调用notify()方法,这样将唤醒原来等待中的线程,然后释放该对象锁,而sleep()方法仅仅释放CPU资源或者让当前线程停止执行一段时间,但不会释放锁。

为什么wait和notify、notifyAll方法要在同步块中调用?

wait、notify、notifyAll是Java中Object对象上的三个方法,在多线程中,可以把某个对象作为事件对象,通过这个对象的wait、notify和notifyAll方法来完成线程间状态通知(也即线程间协同)。

notify和notifyAll都是唤醒调用某个对象的wait方法的线程,二者的区别在于,notify会唤醒一个等待线程,而notifyAll会唤醒所有的等待线程。

wait和notify、notifyAll方法要在同步块中调用,跟上述问题相互补充,主要是因为Java API强制要求这样做,如果你不这么做,你的代码会抛出IllegalMonitorStateException异常;还有一个原因是为了避免wait和notify之间产生竞态条件。

wait()/notify()的使用方式如下:

基本上wait()/notify()与sleep()/interrupt()类似,只是前者需要获取对象锁。

为什么应该在循环中检查等待条件?

  处于等待状态的线程可能会收到错误警报和伪唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件的情况下退出。也可以这么说,在notify()方法调用之后和等待线程醒来之前这段时间,等待线程原来的等待状态可能会改变,这就是在循环中使用wait()方法效果更好的原因。

在一个对象上,多个线程是否可以调用不同的同步实例方法?

不能,因为对象同步了实例方法,某个线程调用对象的同步实例方法时获取了对象的对象锁,只有当执行完该方法释放对象锁后才能执行其它同步方法;但是多个线程可以同时访问不同实例的某个同步实例方法。

怎么检测一个线程是否拥有锁?

在java.lang.Thread中有一个方法叫holdsLock(),当且仅当指定线程拥有某个具体对象的锁时返回true。

何为基于共享容器协同的多线程模式以及基于事件协同的多线程模式?

在一些场景中我们需要在多个线程之间对共享的数据进行处理,例如经典的生产者-消费者模式,此即基于共享容器协同的多线程模式;

若一场景中有A、B两个线程,B线程需要等到某个状态或事件发生后才能继续自己的工作,而这个状态改变或者事件产生与A线程有关,此场景即基于事件协同的多线程模式

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

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

一个线程运行时发生异常会怎样?

  如果异常没有被捕获,该线程将会停止执行。Thread.UncaughtExceptionHandler是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中断的时候,JVM会使用Thread.getUncaughtExceptionHandler()来查询线程的UncaughtExceptionHandler,并将线程和异常作为参数传递给handler的uncaughtException()方法进行处理。

假设有三个线程T1,T2,T3,怎么确保它们按顺序执行?

  在多线程中有多种方法可以让线程按特定顺序执行,如你可以用线程类的join()方法在一个线程中启动另一个线程T,线程T执行完成后原线程继续执行。为了确保三个线程的顺序,你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成。

Thread类中的yield方法有什么作用?

  Yield方法可以暂停当前正在执行的线程对象,让其它有相同优先级的线程执行。它是一个静态方法,而且只保证当前线程放弃CPU占用,不能保证使其它线程一定能占用CPU,执行yield()的线程有可能在进入到暂停状态后马上又被执行。

Java线程池中submit() 和 execute()方法有什么区别?

  两个方法都可以向线程池提交任务,execute()方法的返回类型是void,它定义在Executor接口中, 而submit()方法可以返回持有计算结果的Future对象,它定义在ExecutorService接口中,它扩展了Executor接口,其它线程池类(如:ThreadPoolExecutor和ScheduledThreadPoolExecutor)都有这些方法。

如果你提交任务时,线程池队列已满发会生什么?

事实上如果一个任务不能被调度执行,那么ThreadPoolExecutor.submit()方法将会抛出一个RejectedExecutionException异常。

如何在Java中创建Immutable对象?

  Immutable对象可以在没有同步的情况下共享,降低了对某个对象进行并发访问时的同步化开销。这个问题看起来与多线程没有什么关系, 但不变性有助于简化已经很复杂的并发程序。Java没有@Immutable这样的注解符,要创建不可变类,要实现下面几个步骤:将所有的成员声明为私有的、对变量不提供setter方法(这样就不允许直接访问这些成员)、通过构造方法初始化所有成员、在getter方法中不要直接返回对象本身而是克隆对象并返回对象的拷贝。

什么是线程组

  在java的多线程处理中有线程组ThreadGroup的概念,ThreadGroup是为了方便线程管理出现的。我们可以统一设定线程组的一些属性,比如设置未捕获异常的处理方法,设置统一的安全策略等,也可以通过线程组方便地获得线程的一些信息。

  每一个ThreadGroup都可以包含一组子线程和一组子线程组,在一个进程中线程组是以树的方式存在,通常情况下根线程组是system线程组,system线程组下是main线程组,默认情况下第一级应用的线程组是通过main线程组创建出来的,也就是说system线程组是所有线程最顶级的父线程组。

Thread.currentThread().getThreadGroup();//可以获得当前线程的线程组

线程组与线程池的区别:

线程组和线程池是两个不同的概念,他们的作用完全不同,前者是为了方便线程的管理,后者是为了管理线程的生命周期,复用线程,减少创建销毁线程的开销。

JVM中哪个参数是用来控制线程的栈堆栈小的?

-Xss参数是用来控制线程的堆栈大小的。

你如何在Java中获取线程堆栈?

  对于不同的操作系统,有多种方法来获得Java的线程堆栈。当你获取线程堆栈时,JVM会把所有线程的状态存到日志文件或者输出到控制台。在Windows你可以使用Ctrl+ Break组合键来获取线程堆栈,Linux下用kill -3命令。你也可以用jstack这个工具来获取,它对线程id进行操作,你可以用jps这个工具找到id。

java并发:简单面试问题集锦的更多相关文章

  1. Java软件工程师面试常见问题集锦之一

    1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象 ...

  2. Java并发-多线程面试(全面)

    1. 什么是线程?2. 什么是线程安全和线程不安全?3. 什么是自旋锁?4. 什么是Java内存模型?5. 什么是CAS?6. 什么是乐观锁和悲观锁?7. 什么是AQS?8. 什么是原子操作?在Jav ...

  3. 【转】Java Web Services面试问题集锦

    Q. 应用集成方式有哪些? A. 应用可以采用以下方式集成: 1. 共享数据库 2. 批量文件传输 3. 远程过程调用(RPC) 4. 通过消息中间件来交换异步信息(MOM) Q. 应用集成可以采用的 ...

  4. 【转】Java集合框架面试问题集锦

    Java集合框架(例如基本的数据结构)里包含了最常见的Java常见面试问题.很好地理解集合框架,可以帮助你理解和利用Java的一些高级特性.下面是面试Java核心技术的一些很实用的问题. Q:最常见的 ...

  5. 一个故事搞懂Java并发编程

    最近在给别人讲解Java并发编程面试考点时,为了解释锁对象这个概念,想了一个形象的故事.后来慢慢发现这个故事似乎能讲解Java并发编程中好多核心概念,于是完善起来形成了了这篇文章.大家先忘记并发编程, ...

  6. 不藏了,摊牌了,一张知识图谱整理完整Java并发体系,就问全不全

    推荐阅读: 2020年马士兵Java多线程高并发讲解——百万年薪架构师告诉你Java多线程与高并发 目录 这是我关于整个Java并发体系的整理,结合的主要是现在市面上对于Java并发在面试的过程中经常 ...

  7. Java并发编程73道面试题及答案 —— 面试稳了

    今天主要整理一下 Java 并发编程在面试中的常见问题,希望对需要的读者有用. 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任 ...

  8. 【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!

    本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.欢迎 Sta ...

  9. 【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!

    本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.觉得内容不错 ...

随机推荐

  1. 使用JUnit4测试Spring

    测试DAO import static org.junit.Assert.*; import org.junit.Before; import org.junit.Ignore; import org ...

  2. H264解码学习-2015.04.16

    今天看了不少,却感觉收获寥寥. 1.H264相关知识 因为RTP协议发过来的数据已经经过了H264编码,所以这边需要解码.补充一下H264的相关知识. 与以往的视频压缩标准相比,H.264 视频压缩标 ...

  3. Linux 开机自启动脚本详解

    以kibana为例     以下为skibana名称的脚本内容 #!/bin/bash #chkconfig: 2345 80 90 #description:kibana kibana=" ...

  4. ubuntu16.04下vim安装失败

    问题? 重装了ubuntu系统,安装vim出现了以下问题:   sudo apt-get install vim   正在读取软件包列表... 完成 正在分析软件包的依赖关系树        正在读取 ...

  5. 留念 C语言第一课简单的计算器制作

    留念 C语言第一课简单的计算器制作 学C语言这么久了.  /* 留念 C语言第一课简单的计算器制作 */   #include<stdio.h>  #include<stdlib.h ...

  6. z-index学习知识小结

    一.z-index七阶层叠顺序表 1.层叠顺序的大小比较: background/border < 负z-index < block块状水平盒子 < float浮动盒子 < i ...

  7. 怎样在ZBrush中快速绘制人体躯干

    之前我们对人体骨点的雕刻,了解了人体骨骼比例结构特征.今天的ZBrush教程将通过ZBrush®遮罩显示的特点对模型的人体躯干进行细致雕刻.文章内容仅以fisker老师讲述为例,您也可以按照自己的想法 ...

  8. [No000061]"别人"凭什么要帮你?&理解中国人的人际和谐&外人、自己人与另一半

    你出身平凡家庭:你毕业于普通大学:你没有田晓霞这样的妻子或者普京这样的丈夫:在权力.金钱乃至能力积累上,你才刚刚上路.你很年轻,你渴望成功,那么,"别人"凭什么帮你? " ...

  9. 为什么xcode7请求不成功

    1.现在有的工程因为升级xcode7不能进行请求数据,新特性要求App内访问的网络必须使用HTTPS协议.但是现在公司的项目使用的是HTTP协议,使用私有加密方式保证数据安全.现在也不能马上改成HTT ...

  10. http协议(十)实体首部字段

    1.定义 包含在请求和响应中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息 2.Allow 通知客户端能够支持的Request-URI指定资源的所有http方法 如果服务器接收到不支 ...