一、并发和并行的区别
并发是指多个线程操作同一个资源,不是同时执行,而是交替执行,单核CPU,只不过因为CPU的时间片很短,速度太快,看起来是同时执行。(例:张三、李四厨师,共用一口锅炒菜,交替执行)
并行才是真正的同时执行,多核CPU。每个线程使用一个单独的CPU的资源来运行(张三、李四厨师,一人一口锅,一起炒菜)
二、并发概念
并发是指多个线程操作同一个资源,不是同时执行,而是交替执行。
并发是多线程交替的访问同一个资源,该资源本身的特点是同一个时刻只允许一个线程的访问,那么就存在竞争的问题。同一个资源可以是CPU资源,也可以是内存资源。
Java并发的重要性毋庸置疑,其可以最大化的提高计算资源的效率。
三、并发的特性
Java模型是围绕并发过程中如何处理原子性、可见性、有序性3个特征设计的
3.1原子性
如果一个操作是不可分割的,那就是一个原子操作,也叫这个操作具有原子性。相反的,一个操作是可以分割的(如a++ ,它实际上是a=a+1),则就是非原子操作;原子操作是线程安全的,非原子操作是非线程安全的,但是可以通过同步技术(lock)或同步数据模型(Concurrent容器等)把非原子操作序列变成线程安全的原子操作。
1、获取原有值
2、对于值进行加1
3、讲结果复制给a
3.2可见性
一个变量被多个线程共享,如果一个线程修改了这个变量的值,其他线程能够立即得知这个修改,则我们称这个修改具有可见性。
3.3 有序性
Java线程的有序性,表现为两个方面:在一个线程内部观察,所有操作都是有序的,所有指令按照“串行(as-if-serial,字面意思是“像排了序一样”,as-if-serial的真正含义是不管怎么重排序,一个单线程程序的执行结果都必须相同)”的方式执行。
在线程间观察,也就是从某个线程观察另一个线程,则所有其它线程都可以交叉并行执行,是正序的,唯一例外的是被同步方法、同步块、volatile等字段修饰的强制同步的代码,需要在线程间保持有序。