面试题-线程

1.什么是线程 ?线程和进程的区别 ?

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。而进程是系统中

正在运行的一个程序,程序一旦运行就是进程。

区别:(1)线程是 CPU 调度的基本单位,没有独立的地址空间;进程是资源分配的基本单位,有独立的地址空

间。

(2)进程间切换代价大,线程间切换代价小。

(3)进程拥有的资源多,线程拥有的资源少。

(4)一个进程无法直接访问另一个进程的资源,同一进程内的多个线程可以共享该进程的资源。

(5)线程属于进程,不能独立执行,每一个进程至少要有一个线程,并成为主线程。

2.描述 CPU 和多线程的关系 ?

(1)第一阶段:单CPU时代,单CPU在同一时间点,只能执行单一线程。

(2)第二阶段:单CPU多任务阶段,计算机在同一时间点,并行执行多个线程。但这并非真正意义上的同时执

行,而是多个任务共享一个CPU,操作系统协调 CPU 在某个时间点执行某个线程,因为CPU在线程之间切换比较

快,给人的感觉就好像是多个任务在同时运行。

(3)第三阶段:多 CPU 多任务阶段,真正实现了在同一时间点运行多个线程。

3.什么是线程安全和线程不安全 ?

(1)线程安全:指多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结果都是

一样的,不存在执行程序时出现意外结果。

(2)线程不安全:指不提供加锁保护机制,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。

4.描述线程的生命周期 ?(画图)

线程的生命周期包括五个阶段:创建、就绪、运行、阻塞、销毁。

(1)创建:用 new 关键字建立一个线程后,该线程对象就处于创建状态,处于新生状态的线程有自己的内存空

间,通过调用 start() 方法进入就绪状态。

(2)就绪:调用线程的 start() 方法后,线程进入就绪状态,这时候线程处于等待 CPU 分配资源阶段,谁先抢的

CPU资源,谁开始执行。

(3)运行:当就绪的线程被调度并获得 CPU 资源时,便进入运行状态,run() 方法定义了线程的操作和功能。

(4)阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如 sleep()、wait() 之

后线程就处于了阻塞状态,这个时候需要其它机制将处于阻塞状态的线程唤醒,比如调用 notify() 或者 notifyAll()

方法,唤醒的线程不会立刻执行 run() 方法,他们要再次等待 CPU 分配资源进入运行状态。

(5)销毁:如果线程正常执行完毕后或线程被提前强制性的终止或者出现异常导致结束,那么线程就要被销毁,

同时释放资源。

5.wait、sleep、join、yield 的区别 ?

(1)wait:wait 方法是属于 Object 类中的,wait 过程中线程会释放对象锁,只有当其它线程调用 notify 时才能

唤醒此线程。wait 使用时必须先获取对象锁,即必须在 Synchronized 修饰的代码块中使用,那么相应的 notify

方法同样也必须在 Synchronized 修饰的代码块中使用,如果没有在 Synchronized 修饰的代码块中使用,那么在

运行时就会抛出 IllegalMonitorStateException 异常。

(2)sleep:在指定时间内让当前正在执行的线程暂停执行,sleep 过程中线程不会释放锁,只会阻塞线程,当到

了指定的时间后才会自动恢复运行状态。

(3)join:等待调用 join 方法的线程结束之后,程序将会继续执行。

(4)yield:暂停当前正在执行的线程对象,yield 过程中不会释放资源锁,和 sleep 不同的是 yield 方法并不会让

线程进入阻塞状态,而是让线程重回就绪状态,允许其它具有相同优先同级的线程获得运行的机会。

6.Synchronized 和 Lock 的区别 ?

(1)Lock 是一个接口,而 Synchronized是 java 的一个关键字。

(1)Lock 有比 Synchronized 更精确的线程语义和更好的性能。

(2)Synchronized 会自动释放锁,从而可以避免死锁,而 Lock 一定要求程序员手工释放,可能引起死锁,并且

必须在 finally 从句中释放。

7.ThreadLocal、Volatile、Synchronized 的作用和区别 ?

(1)ThreadLocal 不是为了解决多线程访问共享变量,而是为每个线程创建一个单独的变量副本,提供了保持对

象的方法和避免参数传递的复杂性。

(2)Volatile 主要是用来在多线程中同步变量。

(3)Synchronized 关键字保证了数据读写一致和可见性等问题。

8.同步方法和同步代码块哪个更好 ?

(1)同步代码块是更好的选择,因为它不会锁住整个对象,而同步方法会锁住整个对象,哪怕这个类中有多个不

相关联的同步代码块,这通常会导致他们停止执行并需要等待获得这个对象上的锁。

(2)同步代码块更符合开发调用的原则,只要在需要锁住的代码块中锁住相应的对象,这样从侧面来说也可以避

免死锁。

  • 同步方法使用 Synchronized 修饰方法,在调用该方法前,需要获得内置锁(java每个对象都有一个内置

    锁),否则就处于阻塞状态。

  • 同步代码块使用 Synchronized(object){} 进行修饰,在调用该代码块时,需要获得内置锁,否则就处于阻塞状

    态。

9.什么是死锁 ?如何避免死锁 ?

线程死锁:是指由于两个或者多个线程竞争资源或者互相持有对方所需要的资源,导致这些线程处于等待状态,无

法前往执行,当两个线程相互等待对方释放资源时,就会发生死锁。

(1)避免多次锁定。

(2)具有相同的加锁顺序。

(3)使用定时锁。

(5)死锁检测。

10.常见的线程池叫什么 ?线程池的作用是什么 ?

常见的线程池有:FixedThreadPool、CachedThreadPool、SingleThreadPool、ScheduledThreadPool。

作用:(1)减少在创建和销毁线程上所花的时间以及系统资源的开销 。

​ (2)如果不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及 ”过度切换”。

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

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

相关文章

区块链入门教程

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 区块链(blockchain)是眼下的大热门,新闻媒体大量报道,宣称它将创造未来。 可是&#xf…

响应式面包屑菜单

在线演示 本地下载 转载于:https://www.cnblogs.com/qixidi/p/10064991.html

5个能提高你工作效率的Excel技巧

Excel的应用在工作中还是十分广泛的,那么下面小编就来为大家分享5个Excel技巧来帮助大家轻松提高工作效率。1. 不用数据验证或数据有效性,自动生成下拉列表方法:按【Alt↓】组合键注意点:光标要定位在已有数据区域的下一个单元格&…

正则介绍_grep

2019独角兽企业重金招聘Python工程师标准>>> 10月16日任务 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 grep基本用法 grep [-cinvABC] word filename centos7.x版本的grep实则为grep --colorauto-c 显示匹配到的行数[rootlocalhost ~]# cp /etc/passwd /tmp [rootl…

Python实现Adaboost

1.Adaboost概念 提升方法的思路是综合多个分类器,得到更准确的分类结果。 即“三个臭皮匠顶个诸葛亮”。《统计学习方法》称AdaBoost是提升算法的代表,所谓提升算法,指的是一种常用的统计学习方法,应用广泛且有效。在分类问题中&a…

android studio : clang++.exe: error: invalid linker name in argument '-fuse-ld=bfd

公司jenkins上的C编译器最近换成了clang,今天更新了代码发现本地的C/C代码用NDK编译不过了,提示: “clang.exe: error: invalid linker name in argument -fuse-ldbfd” 解决办法: 将Android.mk文件中的“LOCAL_LDFLAGS -fuse-ld…

(1)初始化项目

2019独角兽企业重金招聘Python工程师标准>>> &#xff08;1&#xff09;初始化项目 1 使用vue-cli初始化项目 vue init webpack my-renren得到以下输出&#xff1a; ? Project name my-renren ? Project description A Vue.js project ? Author neumeng <4048…

使用SpringBoot yml配置文件

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.上一次我们已经使用SpringBoot实现了一个简单的HelloWord程序&#xff0c;辣么接下来我们简单的使用一下他的yml格式的配置文件。 2.在…

软件行业资讯

为什么只有设计师才能发明流行的新语言 先回顾一下知名编程语言的作者和创造时间&#xff1a;Fortran 语言&#xff0c;50年代&#xff0c;IBM 研究员&#xff1b;Lisp 语言&#xff0c;50年代&#xff0c;MIT 的教授和学生&#xff1b;C语言&#xff0c;70年代&#xff0c;贝尔…

电子科大软件系统架构设计——软件建模详细设计

文章目录 软件建模详细设计概述软件建模详细设计目标软件建模详细设计原则开闭原则里氏 (Liskov) 替换原则依赖倒置原则接口分离原则单一职责原则最少知识原则&#xff08;迪米特法则&#xff09;高内聚原则松耦合原则可重用原则 软件建模详细设计内容 UML 软件静态结构视图建模…

120分钟React快速扫盲教程

在教程开端先说些题外话&#xff0c;我喜欢在学习一门新技术或读过一本书后&#xff0c;写一篇教程或总结&#xff0c;既能帮助消化&#xff0c;也能加深印象和发现自己未注意的细节&#xff0c;写的过程其实仍然是一个学习的过程。有个记录的话&#xff0c;在未来需要用到相关…

微信小程序 悬浮按钮

2019独角兽企业重金招聘Python工程师标准>>> 效果视频 https://pan.baidu.com/s/1yfrDaG9YAX0--v0EA3awZA 布局需要按照圆形排列&#xff0c;所以我们需要计算每个点的坐标 代码部分 <view styleposition:fixed; wx:for"{{list}}" wx:for-index"i…

Micronaut教程:如何使用基于JVM的框架构建微服务

\本文要点\\Micronaut是一种基于jvm的现代化全栈框架&#xff0c;用于构建模块化且易于测试的微服务应用程序。\\tMicronaut提供完全的编译时、反射无关的依赖注入和AOP。\\t该框架的开发团队和Grails框架的开发团队是同一个。\\tMicronaut框架集成了云技术&#xff0c;服务发现…

解决Coldfusion连接MySQL数据库的问题

在连接MySQL时&#xff0c;出现了如下错误&#xff1a; Connections to MySQL Community Server are not supported. Please contact MySQL to obtain a MySQL Enterprise or Commercial version. 解决方案&#xff1a; step 1: download the JDBC driver JDBC Driver for MySQ…

C语言union关键字

union 关键字的用法与struct 的用法非常类似。union 维护足够的空间来置放多个数据成员中的“一种”&#xff0c;而不是为每一个数据成员配置空间&#xff0c;在union 中所有的数据成员共用一个空间&#xff0c;同一时间只能储存其中一个数据成员&#xff0c;所有的数据成员具有…

Python学习第一天-第2节

*本节课内容参见&#xff1a;https://www.cnblogs.com/jin-xin/articles/7459977.html运行第一个Python程序 print(hello world) 将文本文件保存为以.py结尾的文件&#xff0c;如hello_world.py &#xff0c;在终端中&#xff0c;运行命令&#xff1a;Python hello_world.py&am…

JDK1.8使用Dubbo时需注意

2019独角兽企业重金招聘Python工程师标准>>> Dubbo自带的很多包都比较旧了&#xff0c;其中的javassist在JDK1.8上运行会报错 而且错误通常比较诡异&#xff0c;javassist是编辑和创建Java字节码的类库&#xff0c;常见的错误会从spring中报出 解决办法&#xff1a;…

深入了解RabbitMQ工作原理及简单使用

深入了解RabbitMQ工作原理及简单使用 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建深入了解RabbitMQ工作原理及简单使用RabbitMQ交换器Exchange介绍与实践RabbitMQ事务和Confirm发送方消息确认——深入解读使用Docker部署RabbitMQ集群你不知道的RabbitMQ集群架构全解RabbitM…

Spring3.2新注解@ControllerAdvice

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 ControllerAdvice&#xff0c;是spring3.2提供的新注解&#xff0c;从名字上可以看出大体意思是控制器增强。让我们先看看ControllerAdv…

C语言关键字

C语言do、while、for关键字—循环 C 语言中循环语句有三种&#xff1a;while 循环、do-while 循环、for 循环。while 循环&#xff1a;先判断while 后面括号里的值&#xff0c;如果为真则执行其后面的代码&#xff1b;否则不执行。while&#xff08;1&#xff09;表示死循环。…