面试时候屡次被问到,本身回答感受很通常,回答了如下几点:面试
进程是资源分配的基本单位,可是线程不拥有资源,线程能够访问同一进程的资源算法
线程是独立调度的基本单位,同一进程中,线程的切换不会引发进程切换,从一个进程内的线程切换到另外一个进程内的线程会引发进程切换安全
建立和撤销进程时,系统都要为之分配或回收资源,所付出的开销远大于建立或撤销线程时的开销。一样的在进程切换时,也会涉及当前执行进程 CPU 环境的保存以及新调度进程 CPU 环境的设置,而线程的切换只需保存和设置少许寄存器的内容,开销很小多线程
进程间通讯须要进程同步和互斥手段的辅助,以保证数据的一致性。而线程间能够经过直接读/写赞成进程中的数据段(如全局变量)来进行通讯。并发
这是面试腾讯的面试题,同一进程中有多个线程共享资源,确定会出现资源的不够用,简单来讲就是可能出现线程死锁,这里我当时有点不愿定,觉得只能出现进程死锁,实际上线程也会出现死锁,面试官问个人时候我就直接按照进程死锁的来讲了ide
这个问题就是要考察死锁发生的条件,如何避免死锁。我先是简单介绍了死锁发生的四个条件,当时也是想既然是死锁,无论线程仍是进程发生死锁的条件应该是一致的,就直接说了,后面查资料证实事实就是这样的,惟一不一样之处就是死锁的基本单元不一样,一个是进程之间,一个是线程之间。测试
死锁的四个必要条件:spa
死锁案例:操作系统
package opersystem;
/** * @author YaboSun */
public class DeadLock {
// 经过一个简单的例子测试线程死锁
public static void main(String[] args) {
// 线程a
Thread a = new Thread(new Runnable() {
@Override
public void run() {
DeadLock.method1();
}
});
// 线程b
Thread b = new Thread(new Runnable() {
@Override
public void run() {
DeadLock.method2();
}
});
a.start();
b.start();
}
private static void method1() {
synchronized (String.class) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程 a 尝试获取integer.class");
synchronized (Integer.class){
}
}
}
private static void method2() {
synchronized (Integer.class) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程 b 尝试获取 string.class");
synchronized (String.class){
}
}
}
}
复制代码
那么避免死锁的出现就是破坏其中的必要条件:.net
参考: 一句话+一张图说清楚银行家算法
当一个进程申请使用资源的时候,银行家算法经过试探分配给该进程资源,而后经过安全性算法判断分配后的系统是否处于安全状态,若不安全则试探分配做废,让该进程继续等待
如何判断系统处于安全状态?
若是没有死锁发生, 而且即便全部进程忽然请求对资源的最大需求,也仍然存在某种调度次序可以使得每个进程运行完毕,则称该状态是安全的。