面试题
1. 线程和进程之间的区别?
l 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
l 线程的划分尺度小于进程,使得多线程程序的并发性高。
l 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
l 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能 够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
l 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。
![](https://i-blog.csdnimg.cn/blog_migrate/23e0d6e1cc1cdae281b9635b6970a270.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a4758bceb7658e754a2432edcafb46e7.png)
1. 导致死锁的原因?
死锁:是指多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进。原因有如下三个:
(1)因为系统资源不足。
(2)进程运行推进的顺序不合适。
(3)资源分配不当等。
java 死锁产生的四个必要条件:
1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
4、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。
2. 解决死锁的方法?
1. 撤消陷于死锁的全部进程。
2.逐个撤消陷于死锁的进程,直到死锁不存在。
3.从陷于死锁的进程中逐个强迫放弃所占用的资源,直到死锁消失。
4.从另外一些进程那里强行剥夺足够数量的资源分配给死锁的进程,以解除死锁状态。
3. 什么是同步?什么是异步?
答:同步:发送一个请求,等待返回,然后再发送下一个请求 。
异步:发送一个请求,不等待返回,随时可以再发送下一个请求 。
同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内容,就会出错,同步就会按顺序来修改。
异步则是可以提高效率了,现在cpu都是双核,四核,异步处理的话可以同时做多项工作,当然必须保证是可以并发处理的。
这些都是对的。
同步和异步最大的区别就在于。一个需要等待,一个不需要等待。
比如广播,就是一个异步例子。发起者不关心接收者的状态。不需要等待接收者的返回信息。电话,就是一个同步例子。发起者需要等待接收者,接通电话后,通信才开始。需要等待接收者的返回信息。
下面这个例子:
脏数据:脏数据在临时更新(脏读)中产生,事物A更新了某个数据项X,但是由于某种原因,事物A出现了问题,于是要把A回滚,但是在回滚之前,另一事物B读取了数据项X的值(A更新后),A回滚了事物,数据项恢复了原值,事物B读取的就是数据项X的就是一个"临时"的值,就是脏数据