1. 进程与线程区别
进程:CPU资源分配的最小单位,具有独立的地址空间,进程间不会相互影响;
线程:CPU调度的最小单位,是进程中不同的执行路径,共享进程的地址空间和其他资源,同时还拥有自己的栈、指针、程序计数器等资源。
2. 如何进行线程切换,有何影响
切换:调用Thread.sleep()
或t.join()
方法,或调用notify()
或notifyAll()
并将本线程至于等待状态;
影响:上下文切换需要保存当前线程的局部变量、程序计数器等,并加载待执行线程的相应内容,有一定的开销并且增加了内存的消耗。
3. 线程之间如何进行同步
- synchronized同步方法;
- synchronized同步代码块;
- 使用volatile关键字:提供一种免锁访问机制,每次使用时会刷新获取最新版本;
- 使用重入锁(ReentrantLock);
- 使用ThreadLocal管理变量,每个线程会获得该变量的副本,相互独立。
4. 死锁如何造成,如何避免
造成死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用;
(2) 请求与等待条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;
(3) 不剥夺条件:进程已获得的资源在未使用完之前,不能强行剥夺;
(4) 循环等待条件:若干个进程间形成循环等待资源的关系。
避免:允许前三个条件存在,但通过合理的资源分配算法来确保不会发生循环等待链,如银行家算法。
5. 进程间通信方式
- 无名管道
- 高级管道
- 有名管道
- 消息队列
- 信号量
- 信号
- 共享内存
- 套接字socket