Java面试题总结4

sleep(),wait(),join(),yield()的区别

sleep是Thread类的静态本地方法,wait则是object类的本地方法。

sleep方法不会释放lock,但wait会释放,而且会加入到等待队列中。

sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized

sleep一般用于当前线程休眠,或者轮循暂停操作,wait则不一定,wait后可能还是会有机会重新

竞争到锁继续执行的

yield()执行后线程直接进入就绪状态,马上释放cpu的执行权,但是依然保留了cpu的执行资格,所以有可能cpu下次进行线程调度还会让这个线程获取到执行权继续执行

join()执行后线程进入阻塞状态,例如在线程B中调用线程A的join(),那线程B会进入到阻塞队列,直到线程A结束或中断线程

对线程安全的理解

没有所谓的线程安全,指的应该是内存安全,堆和栈。

堆:堆是进程和线程共有的空间,分全局堆和局部堆,全局堆也就是所有没有分配的空间,局部堆就是用户分配的空间,堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是结束后需还给操作系统,否则会内存泄漏。

栈:栈是每个线程独有的,保存其运行状态和局部自动变量的,栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是线程安全的,操作系统在切换线程的时候会自动切换栈,栈空间不需要在高级语言里面显示分配和释放

Thread,Runable的区别

Thread是一个类,Runnable是一个接口

Thread继承了Runnable类,无论使用Runable还是Thread,都会new Thread,然后实现run方法,用法上如果有复杂的线程操作需求,那就继承Thread,如果只是简单的执行一个任务,那就实现runnable,他们实质上就是继承关系。

说说对守护线程的理解

守护线程:为所有非守护线程提供服务的线程,任何一个守护线程都是整个JVM中所有非守护线程的保姆,

应用场景:为其他的线程提供服务支持的情况,或者在任何情况下,程序结束后,这个线程必须正常立刻关闭,就可以作为守护线程来使用,反之,如果一个正在执行某个操作的线程必须要正确的关闭,否则就会出现不好的后果的话,那这个线程就不能作守护线程,而是用户线程,通常是一些关键的事务,比如数据库的录入或者更新,这些操作都是不能中断的

可以把守护线程理解为用户线程

并发,并行,串行的区别。

串行在时间上不可能发生重叠,前一个任务没搞定,下一个任务就只能等着

并行在时间上是重叠的,两个任务在同一时刻互不干扰的同时执行。

并发允许两个任务彼此干扰,同一时间点,只有一个任务运行,交替执行。

相关推荐
最后一个bug几秒前
浅显易懂的讲解MMU是如何使用4级页表把虚拟地址转化为物理地址的~
linux·服务器·开发语言·系统架构·计算机外设
__万波__1 分钟前
二十三种设计模式(十五)--访问者模式
java·设计模式·访问者模式
superman超哥1 分钟前
Rust 函数定义与参数传递:所有权系统下的设计艺术
开发语言·rust·设计艺术·rust函数定义·rust参数传递
2301_789015622 分钟前
C++:set/multiset和map/multimap文档详细解析
c语言·开发语言·c++·vscode·排序算法·set·map
“抚琴”的人3 分钟前
C#上位机策略模式
开发语言·c#·策略模式
CoderCodingNo3 分钟前
【GESP】C++五级真题(数论-素数思想考点) luogu-P10720 [GESP202406 五级] 小杨的幸运数字
开发语言·c++·算法
zmzb01033 分钟前
C++课后习题训练记录Day59
开发语言·c++
黎雁·泠崖4 分钟前
C 语言文件操作进阶:格式化读写 + 二进制读写 + 随机读写进阶全解
c语言·开发语言
fanruitian8 分钟前
SpringBoot 集成retrofit httpclient
java·spring boot·retrofit
talenteddriver11 分钟前
web: jwt令牌构成、创建的基本流程及原理
java·开发语言·python·网络协议·web