多线程
线程与进程
进程:
- 是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间
线程:
- 是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个线程
- 线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干个线程
线程调度
分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
抢占式调度
- 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
- CPU使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核新而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是 在同一时刻运行。 其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。
同步与异步
同步:排队执行 , 效率低但是安全.
异步:同时执行 , 效率高但是数据不安全.
并发与并行
并发:指两个或多个事件在同一个时间段内发生。
并行:指两个或多个事件在同一时刻发生(同时发生)。
线程的六种状态:
状态名称 | 描述 |
---|---|
NEW | 尚未启动的线程处于此状态。 |
RUNNABLE | 在Java虚拟机中执行的线程处于此状态。 |
BLOCKED | 被阻塞等待监视器锁定的线程处于此状态。 |
WAITING | 无限期等待另一个线程执行特定操作的线程处于此状态。 |
TIMED_WAITING | 正在等待另一个线程执行最多指定等待时间的操作的线程处于此状态。 |
TERMINATED | 已退出的线程处于此状态。 |
线程在给定时间点只能处于一种状态。 这些状态是虚拟机状态,不反映任何操作系统线程状态。
线程锁
隐式锁
- 同步代码块
创建synchronized代码块,注意要先创建对象,才可以使用同一把锁
synchronized (o) {
}
- 同步方法
在方法前标记synchronized
public synchronized boolean sale(){
显示锁
显示锁更加利于操作
创建锁对象,使用lock、unlock方法来上锁、开锁
//参数为true表示公平锁 默认是false 不是公平锁
private Lock l = new ReentrantLock(true);
l.lock();
{ }
l.unlock();