并发和并行
并发是单个cpu,偏重于多个任务的交替进行,重点在于不断地切换任务,以达到并行的效果,其实是串行进行的。
并行是真正的并行,是多个cpu同时工作,任务是并行执行的,省去了任务切换的时间,大大提高了效率。
临界区
临界区的就是公共资源区,被所有线程共同分享的区域,在Java内存模型中,java堆就是典型的临界区。
阻塞和非阻塞
阻塞是指在线程在执行时由于cpu资源或者临界区资源的权限拿不到而导致的线程的停止等待。
非阻塞是指一个线程不受这些资源的影响,可以不断的执行程序。
死锁,饥饿,活锁
死锁是指多个线程在资源的抢夺时出现的一种阻塞现象,如果没有外力的作用将会永久的持续下去。
饥饿是指线程在资源的抢夺过程中由于种种原因导致一直未能得到资源而产生的一种不能执行的状态。
活锁是指在资源的抢夺过程中线程能够自己解决的一种阻塞现象,这种阻塞是可以自发的解决。
多线程的三大特性
原子性是指一个线程的操作只能存在两种状态,一是不执行,二是一旦执行将不可中断的执行完毕。比如a+b操作就是存在着原子操作,存在着取指令,取值的,计算的操作。
可见性是指在多个线程工作时,一个线程对于临界区资源的修改,或者修改后的数据对其他线程是可见的,当其他线程得知自己目前拿到的数据已经不是最新的数据时会释放掉此时拿到的数据,保证数据的准确性。
有序性是指在程序的运行过程中出现指令的重排,意思就是写在前面的代码后执行,写在后面的代码提前执行,指令重排的目的是减少中断浪费的时间,原则是不影响程序最后得到的结果,方式根据代码与代码之间的依赖性判断是否可以重排。具体规则可以参考https://blog.csdn.net/liu_dong_liang/article/details/80391040。