study.163.com/course/introduction/1003571003.htm#/courseDetail
一、同步(synchronous)与异步(asynchronous)
同步调用一旦开始,调用者必须等到本次调用返回之后,才能继续后面的调用;
异步调用开始之后,无须等待本次调用结束就可以继续后面的调用;
二、并发与并行
当多线程在只有一个CPU的系统上运行时,是并发操作,实际上是切换CPU来执行;
当多线程在有多个CPU的系统上运行时,有可能就是并行操作,每个线程在不同的CPU上执行;
三、临界区
临界区用来表示公共资源或共享数据,可以被多个线程使用,但同一时间点只能被一个线程使用,其它线程想使用这个资源,就得等待,直到资源被释放。
四、阻塞与非阻塞
一外线程占用了临界区资源,其它线程就得等待,这就是阻塞。
五、死锁、饥饿与活锁
死锁:临界区资源被线程占用,无法释放;
饥饿:某个线程一直拿不到临界区资源,一直等待下去;
活锁:每个线程都是一拿到临界区资源立马就释放了,互相谦让临界区资源,都不占用临界区资源;
六、java的内存模型(JMM)
JMM的关键技术点都是围绕着多线程的原子性、可见性与有序性来展开的。
原子性:操作不能中断;
可见性:一个线程修改了共享变量,其它线程立即知道这个修改;
有序性:我们习惯认为,代码是从上往下执行的,但有时可能不是这样的;
网友评论