您的位置:首页 > 编程语言 > Java开发

java高频面试题及解析 一

2020-07-14 05:32 323 查看

从自己大三找实习到现在为止,去过很多很多大大小小的公司面试,每个公司的面试官都会或多或少的问到一些重复的问题。很多面试题不是我们能把握得住的,我们在去一家公司面试的时候,对一大部分问题能解答甚至一半的问题能解答得让面试官很满意,那么这次的面试就不算是很失败,至少对于自己而言,有一定的可能会成功,而不是面试完就觉得自己这次面试失败,没戏了。所以针对一些常见的面试问题,这里做了一些简单的归纳,归纳的不是很仔细,更多的是要自己去慢慢拓宽自己的知识点,才能对知识有一个很好的理解。
一. 多线程,死锁问题,预防死锁,解除死锁
这个是我面试这么多次以来,经常被问到的问题。
“谈谈什么是死锁?”“谈谈死锁的条件?”“什么是多线程?”“线程池的好处是什么?”等等……
(1).产生死锁的原因
竞争资源和程序间推进顺序非法
(2).死锁的四个必要条件
互斥条件,请求与保持,不可剥夺条件,环路等待条件
四个条件,缺少任何一个都不构成死锁
举个简单例子
线程X 持有资源A 申请资源B
线程Y 持有资源B 申请资源A
且都不可剥夺,这个时候就产生了死锁
(3).预防死锁
资源分配:一次性分配所有资源(破坏请求条件)
只要有一个资源得不到分配,也不给这个进程分配其他的资源(破坏请保持条件)
可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
(4).解除死锁
这里涉及到银行家算法,解释起来很多,可以去搜搜看,了解一下
(5).多线程
简单了解一下线程与进程
线程:程序中最小的执行单位
进程:资源分配的最小单位
一个进程里可以有多个线程,当单线程执行的时候,线程以串行的方式运行
这个时候效率很低,满足不了客户需求,这个时候就有必要用到多线程
即:多个线程同时跑,这时候很多线程并行运行
(6)线程安全
当多个线程访问某个方法时,不管你通过怎样的调用方式、或者说这些线程如何交替地执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类是线程安全的。
既然是线程安全问题,那么毫无疑问,所有的隐患都是在多个线程访问的情况下产生的,也就是我们要确保在多条线程访问的时候,我们的程序还能按照我们预期的行为去执行
(7)确保线程安全
有synchronized和lock锁,这里就不做详细介绍了
(8)线程池
为每个请求创建一个新线程的开销很大;为每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。除了创建和销毁线程的开销之外,活动的线程也消耗系统资源(线程的生命周期!)。在一个JVM 里创建太多的线程可能会导致系统由于过度消耗内存而用完内存或“切换过度”。为了防止资源不足,服务器应用程序需要一些办法来限制任何给定时刻处理的请求数目。
二.数据库优化
哎,这也是一个老生常谈的问题啊,其重要性不言而喻
总结起来有八点,能记住3点以上并能说明就行
SQL优化,索引,外键,事务这四个大家应该不陌生,经常用到
选取使用的字段属性
在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。
使用连接代替子查询
这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。
使用联合代替手动创建临时表
把需要使用临时表的两条或更多的select查询合并的一个查询中
锁定表
事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是在很大的应用系统中。由于在事务执行的过程中,数据库将会被锁定,因此其它的用户请求只能暂时等待直到该事务结束。如果一个数据库系统只有少数几个用户来使用,事务造成的影响不会成为一个太大的问题;
这里提一句索引不是越多也好,太多反而影响插入性能,所以数量要适可而止。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: