文章目录
一、概述
并行和并发的区别
- 并行:同一时刻,两件或多件事同时发生
- 并发:同一个时间段内,一起发生,走走停停
二、进程
进程和线程的区别
- 进程包含线程
- 进程:资源分配的基本单位;线程:处理机调度基本代为
进程生命周期
创建、就绪、运行、阻塞、终止
- 就绪:缺少处理机资源
- 阻塞:缺少除了处理机以外的资源
线程的6中状态
创建、就绪、运行、阻塞blocking、等待waiting、终止
就绪、阻塞的区别
缺少处理机资源;处理机以外的资源
进程调度算法
- FCFS先来先服务(当时我答的是FIFO,虽然是同一个意思但操作系统用FCFS专业一些)
- 优先级调度(当时没想起来)
- 时间片轮转法 Linux系统用的就是
- 多级反馈队列调度算法
注意:短作业、高响应比都是作业调度算法,不是进程调度算法
三、线程
3种启动线程的方法
- 实现Runnable接口
- 继承Thread接口
- 通过Callable和Future创建线程
Runnable和Callable的区别
- runnable提供run()方法,无返回值;callable()提供call方法,有返回值
- runnable不能通过throws抛出异常;callable可以直接抛出Exception异常
线程run()和start()的区别
- start:会创建新的线程,并且执行在 run()方法里的代码
- run:如果直接调用 run()方法,它不会创建新的线程,也不会执行调用线程的代码
sleep()和wait()的区别
都是等待
- wait:等待别人,等待别的线程;通常是线程间交互的时候用;会释放锁
- sleep:自己sleep,通常是线程自己暂停执行的时候用;会持有锁
notify() notifyAll()的区别
都是用来唤醒线程的
- notify():唤醒单个线程
- notifyAll():唤醒多个线程,然后多个线程公平竞争
守护线程是什么
- 线程分为用户线程和守护线程
- 守护线程是一个服务线程,当所有的用户线程停掉的时候,守护线程才可以停
三-2、多线程
Java如何保证多线程安全
线程安全的集合类
Vector、StringBuffer、ConcurrentHashMap
四、锁
什么是死锁
因为多个进程相互竞争资源、进程之间相互,而导致的一种进程之间相互等待的僵局。
如何防止死锁
死锁预防 静态
破坏死锁的4个必要条件:互斥、不可剥夺、请求并保持、循环等待
死锁避免 动态
- 银行家算法:先试探性地分配资源,然后计算系统是否处于以一个安全状态,安全就分配,不安全就不分配
- 系统不安全:不一定就会发生死锁
synchronized
同步锁
如何实现互斥锁
互斥:当进程进入临界区的时候,另一个进程不允许进入,需要等待,当占用临界资源的进程退出后,另一个进程才能进入。
Java中的乐观锁和悲观锁的区别
锁:一般在读写数据的时候用到,目的都是为了维护数据的一致性,
悲观锁:认为每次我去取数据的时候,都有另一个进程来修改我要读取的数据,如果要连续读取2次,那就导致数据的不一致。为了防止这种情况,在读取数据之前都会上锁,防止数据被别的进程修改。相对来说比较安全,但是没有这么快
乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁。但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁适用于多读的应用类型,这样可以提高吞吐量。
公平锁和非公平锁
公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁
非公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁
举例子:超时排队
你对读写锁的了解
对文件读写的时候需要用到读写锁,读读不加锁,读写、写写加锁
读写锁“读读不互斥”,但只能有一个写进程,只有有写进程,就必须上锁。