一、线程基本概念
1. 同步和异步
同步:调用者必须等被调用者返回了结果后,才可以执行接下来的操作。
异步:调用者无需等到被调用者返回结果后才能执行。被调用者可以异步执行。
2. 并发和并行
并发:某一具体时刻只有一个线程运行,而在一个时间范围内,看到的是多线程一起执行的假象。
并行:某一时刻存在大于一个线程的多个线程在执行,真正的同时执行。
3. 临界区
临界区:多个线程共享的公共资源。但是一旦有一个线程占用了临界区资源,则其他线程都需要等待。
4. 阻塞和非阻塞
阻塞:如果一个线程占用了临界区资源,而其他线程也需要这个资源,那么其他线程需要等待。等待会导致线程挂起,这个时候线程会阻塞。
非阻塞:没有一个线程会妨碍其他线程执行。
5. 死锁、饥饿、活锁
死锁:A占用了临界资源1,B占用了临界资源2,此时线程A需要获取资源2才能执行,与此同时线程B需要资源1才能执行。
饥饿:一个线程因为获取不到必要的资源而导致长时间无法执行的状态。
活锁:和死锁很像,线程A释放资源1的同时线程B释放资源2,而线程A抢到资源2的同时,线程B抢到资源1。
6 线程和进程
线程:程序执行的最小单位。
进程:可以容纳多个线程,是正在运行的.exe程序。
7. 线程的状态
就绪:刚创建的线程,等待start()调用。
运行:获得CPU执行权。
阻塞:遇到synchronized代码块,等到其他线程释放锁。
等待:当调用wait()方法后,等待notify()方法。
死亡:线程执行结束。
二、线程的三性
1. 原子性:一个操作正在运行时是不会被另一个线程干扰的。对于32位Java虚拟机来说,由于long类型是64位,读写不是原子性的,因此可能出现不一致的结果。
2. 可见性:一个线程修改了某一个共享变量的数值,其他线程能否感知到这次修改。
3. 有序性:就一个线程或者同一个线程内,代码运行时有序的。但是如果是多个线程,那么线程之间是交替执行的,没有统一的顺序。
下一章 线程基本概念(二):https://mp.csdn.net/console/editor/html/107094199