小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
摘要
本次分享面试题专题均为自己21届校招时通过牛客以及自己面试遇到的问题,答案均为自己理解整理,如果有错误,请麻烦评论指出,万分感谢,如对您有所帮助,请交出您的三连或者点赞也是爱♥
什么是死锁?怎么防止死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,
怎么防止死锁
死锁的四个必要条件:
- 互斥条件:进程对所分配到的资源不允许其他进程进行访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源
- 请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但又对自己获得的资源保持不放
- 不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完后自己释放
- 环路等待条件:是指进程发生死锁后,若干进程之间形成一种头尾相接的循环等待资源关系
什么是指令重排序?
在虚拟机层面,为了尽可能减少cpu运行速度大于内存操作速度而形成cpu空置的影响,指令重排序打乱了代码运行的顺序,即有可能写在后边的代码在时间顺序上先执行,写在前面的代码在时间顺序上后执行,
在硬件层面,CPU会将接收到的一批指令按照其规则重排序,同样是基于CPU速度比缓存速度快的原因,和上一点的目的类似,只是硬件处理的话,每次只能在接收到的有限指令范围内重排序,而虚拟机可以在更大层面、更多指令范围内重排序
Java提供了两个关键字volatile和synchronized来保证多线程之间操作的有序性,volatile关键字本身通过加入内存屏障来禁止指令的重排序,而synchronized关键字通过一个变量在同一时间只允许有一个线程对其进行加锁的规则来实现
枚举有什么好处?为什么要用枚举?
1 出于类型安全考虑。没有枚举类之前常用静态常量来表示,如
public static final MAN = 0;
public static final WOMAN = 1;
这样的性别定义实际上是一个整型数据,完全可用来做加减运算,当然我们原意并非如此。
2 解决意义不明确。比如调试程序时,本来想输出性别男,结果输出了个0,不是自己写的完全不知道其意义,用枚举类就完美解决了。
3 代码更优雅。一个大一些的程序里面,可能要用到成百上千的静态常量,如果全写在一个文件里面,容易造成命名混淆,程序读起来也比较麻烦。
4 定义自己的类型。如完全可以用enum SEX来包含上面的两种类型,岂不更爽?
一般使用枚举类,出于这几个因素吧。