一、什么是进程?
- 进程是操作系统中资源分配的最基本单位,每个进程都有独立的内存空间。
- 进程是操作系统对正在运行的程序的一种抽象,可以将进程看做程序的一次运行。
- 一个进程内可以包含多个线程。
二、什么是线程?
- 线程是操作系统调度执行的最小单位。
- 同一个进程内的多个线程资源共享。
三、线程的状态
- 新建状态(NEW):线程被创建,但还未执行start()。
- 就绪状态(RUNNABLE):已经执行start()方法,等待CPU调度执行的。
- 运行状态(RUNNING):获得CPU时间片,正在执行。
- 阻塞状态(BLOCKED):需要获取同步资源才能继续执行,但未获得同步资源。
- 等待状态(WAITING):执行wait()的线程。等待其它线程执行notify()、notifyAll()唤醒。
- 超时等待(TIMED_WAITING):执行wait(long timeOut)的线程。超过等待时间后自动运行。
- 销毁状态(TERMINATED):线程执行结束。run()、main()执行结束。
四、常用方法
1. start()
- 开启线程,使线程进入就绪状态。
- 属于Thread类。
2.sleep()
- 使线程进入到超时等待(TIMED_WAITING)状态,等待超时后进入到就绪状态。
- 会释放CPU时间片,但不会释放锁。
- 属于Thread类.
3.wait()
- 使调用线程进入等待状态(WAITING),需要等待其它同资源线程调用notify()、notifyAll()唤醒进入到就绪状态竞争锁。
- 会释放CPU时间片,并释放当前锁.
- 需要配合synchronized同步代码块使用,因为wait()需要释放锁,所以需要先获取锁。
- 属于Object类。因为任何的对象都可能成为锁。
3.wait(long timeout)
- 用线程进入到超时等待状态(TIMED_WAITING),等待超时或被notify()、notifyAll()唤醒后进入就绪状态。
- 会释放CPU时间片,并释放当前锁.
- 需要配合synchronized同步代码块使用,因为wait()需要释放锁,所以需要先获取锁。
- 属于Object类。因为任何的对象都可能成为锁。
4.notify()
- 唤醒同一共享资源,处于WAITING或TIMED_WAITING状态的某一线程,使其进入到就绪状态。
- 并不会立刻释放锁,需要等待当前同步代码块执行完成后再释放锁。
- 需要配合synchronized同步代码块使用。
- 属于Object类。
- 唤醒成功,返回true,唤醒失败返回false。
- 常配合while使用。
5.notifyAll()
- 唤醒同一共享资源,处于WAITING或TIMED_WAITING状态的所有线程,使其进入到就绪状态。
- 并不会立刻释放锁,需要等待当前同步代码块执行完成后再释放锁。
- 需要配合synchronized同步代码块使用。
- 属于Object类。
五、什么是线程安全?
- 多个线程操作同一代码,不会产生不确定的结果。
六、什么是线程不安全?
- 多个线程操作同一代码,会产生不确定的结果。
- 原因:
- 多个线程修改同一变量。
- 指令重排。
- 修改操作不满足原子性。
- 内存可见性引起线程不安全。