一,概述
概念辨析
同步异步通常形容方法调用
同步:同步方法一旦开始,调用者必须等到方法调用返回后才能继续
异步:开始之后方法调用立即返回,调用者可以继续后面的的操作,对调用者来说似乎是一瞬间完成的
并发和并行
并发是多个任务交替执行,并行是多个任务同时执行
阻塞和非阻塞:多线程间的相互影响
阻塞:一个线程占用了临界区资源,其他需要这个资源的线程就必须在临界区中等待,导致线程被挂起
非阻塞:线程间不妨碍,所有线程都尝试不断前进
死锁,饥饿,活锁
死锁:都有资源,都要资源,循环等待
饥饿:一个线程一直无法获取想要的资源
活锁:互相谦让不要资源导致都没有拿到
三个并发问题:原子性,可见性,有序性
原子性:一个操作不会被另一个操作干扰。经典例子是两个线程同时对long型整数写入,对线程之间的结果有干扰,高32位和低32位的数据可能会被不同线程同时修改
可见性:一个线程修改变量,其他线程能否立即知道这个修改。比如线程1把一个变量t的值存在cache里,如果线程2修改了变量t,线程1是无法意识到的
有序性:因为存在指令重排,计算机指令流水线的执行为了尽量避免中断会调整一些指令顺序,所以执行的指令和原指令未必相同
二,基础
进程线程
进程:程序分配和调度资源的最小单位,可以理解为“线程的母亲”
线程:程序执行的最小单位,轻量级进程,线程的切换和调度成本远小于进程
线程状态
NEW:刚创建的线程,还没开始执行
RUNNABLE:线程开始执行
BLOCKED:遇到了synchronized同步块,进入阻塞状态
WAITIN:无时限等待
TIMED_WAITING:有时限等待,比如main里用了join()函数,直到该进程结束再继续
TERMINATED:结束
进程实现
继承Thread,Runnable,Callable
Thread的常见用法
1,currentThread():返回当前线程的引用
2,start:开始执行,调用run
3,yield&