栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JAVA面试题多线程&并发篇(三)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA面试题多线程&并发篇(三)

JAVA面试题多线程&并发篇(三)

文章目录
  • JAVA面试题多线程&并发篇(三)
  • 前言
  • 一、Java程序是如何执行的
  • 二、说说进程和线程的区别?
  • 三、产生死锁的四个必要条件?
  • 四、如何避免死锁?
  • 五、线程池核心线程数怎么设置呢?
  • 六、Java线程池中队列常用类型有哪些?
  • 七、线程安全需要保证几个基本特征?
  • 八、说一下线程之间是如何通信的?
  • 总结


前言

到了大三的学期的暑假,即将面临找工作的考验。希望这份面试资料能够帮住大家学到自己的知识盲区。加油,我命由我不由天!!!


一、Java程序是如何执行的

通常都使用开发工具(IntelliJ IDEA 或 Eclipse 等)可以很方便的调试程序,或者是通
过打包工具把项目打包成 jar 包或者 war 包,放入 Tomcat 等 Web 容器中就可以正常运行了。其实不论是在开发工具中运行还是在 Tomcat 中运行,Java 程序的执行流程基本都是相同的,它的执行流程如下:
1、先把java代码编译成字节码,也就是把.java类的文件编译成.class类的文件。这个过程的大致执行流程:java源代码->词法分析器->语法分析器->语义分析器->字符码生成器->最终生成字节码,其中任何一个节点执行失败就会造成编译失败;
2、把 class 文件放置到 Java 虚拟机JVM。
3、Java 虚拟机使用类加载器(Class Loader)装载 class 文件。
4、类加载完成之后,会进行字节码效验,字节码效验通过之后 JVM 解释器会把字节码翻译成机器码交由操作系统执行。
流程图如下:

二、说说进程和线程的区别?

1、进程是一个“执行中的程序”,是系统进行资源分配和调度的一个独立单位。
2、线程是进程一个实体,一个进程中拥有多个线程,线程之间共分享地址空间和其他资源。
3、线程上下文的切换比进程上下文切换要快很多。

三、产生死锁的四个必要条件?

1、互斥条件:一个资源只能被一个线程使用。
2、请求与保护条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。
3、不剥夺条件:进程已经获得的资源,在未使用完之前,不能强行剥夺。
4、循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。

四、如何避免死锁?

1、比如某个线程只有获得A锁和B锁才能对资源进行操作,在多线程条件下,可以避免死锁。
2、获得锁的顺序是一定的,比如规定,只有A锁的线程才有资格获得B锁,按顺序获取就可以避免死锁。
简单的来说就是把死锁产生的四个必要条件打破即可。

五、线程池核心线程数怎么设置呢?

分为CPU密集型和IO密集型
CPU
这种任务消耗的主要是CPU资源,可以将线程数设置为N(CPU核心数)+1,比CPU核心数多出来的一个线程是为了防止线程偶发的缺页中断,或者其它原因导致的任务暂停而带来的影响。一旦任务暂停,CPU就会处于空闲状态,而在这种情况下多出来的一个线程就可以充分利用CPU的空闲时间。

IO密集型
这种任务应用起来,系统会用大部分的时间来处理 I/O 交互,而线程在处理 I/O 的时间段内不会占用 CPU 来处理,这时就可以将 CPU 交出给其它线程使用。因此在 I/O 密集型任务的应用中,我们可以多配置一些线程,具体的计算方法是 : 核心线程数=CPU核心数量*2。

六、Java线程池中队列常用类型有哪些?

1、ArrayBlockingQueue 是一个基于数组结构的有界阻塞队列,此队列按FIFO(先进先出)原则对元素进行排序。
2、LinkedBlockingQueue 一个基于链表结构的阻塞队列,此队列按FIFO(先进先出)排序元素,吞吐量通常要高于 ArrayBlockingQueue。
3、SynchronousQueue 一个不存储元素的阻塞队列。
4、PriorityBlockingQueue 一个具有优先级的无限阻塞队列。 PriorityBlockingQueue 也是基于最小二叉堆实现。

七、线程安全需要保证几个基本特征?

1、原子性:简单说就是相关操作不会中途被其他线程干扰,一般通过同步机制实现。
2、可见性:是一个线程修改了某个共享变量,其状态能够立即被其他线程知晓,通常被解释为将线程本地状态反映到主内存上,Volatile就是负责保证可见性的。
3、有序性:是保证线程内串行语义,避免指令重排等。

八、说一下线程之间是如何通信的?

线程之间的通信有两种方式:共享内存和消息传递。
共享内存:
在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。典型的共享内存通信方式,就是通过共享对象进行通信。
消息传递:
在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。在 Java 中典型的消息传递方式,就是 wait() 和 notify() ,或者BlockingQueue 。

总结

线程和并发都是非常关键的知识点。整理不易,欢迎大家一起交流,喜欢的朋友记得关注我点赞哟,感谢支持!将会持续的更新下去,你们的点赞和关注是我继续的动力!!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1003420.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号