欢迎关注专栏《Java架构筑基》——专注于Java技术的研究与分享!
Java架构筑基zhuanlan.zhihu.com- Java架构筑基——专注于Java技术的研究与分享!
- 后续文章将首发此专栏!
- 欢迎各位Java工程师朋友投稿和关注
线程和进程的区别
1、资源调度单位
在计算机中,进程是程序运行所使用资源的基本单位。比如传统的一个Web应用,运行它需要多少资源,操作系统应该分配多少资源,都是进程为基本单位进行分配资源(资源包括内存、CPU、磁盘、I/O等)。我们知道CPU是一台计算机的运算核心和控制核心,它的功能解释并处理计算机指令,而进程这种量级的资源对于CPU来说实在太大了,无法调度,将进程划分为多个称为线程的实体,这些实体(线程)又能被CPU进行调度和分配,线程就是CPU调度和分配资源的基本单位。
2、资源边界
每个进程拥有独立的内存空间,进程与进程间的内存资源是相互隔离的,是进程私有的。而多个线程可以共享内存。
3、线程与进程的关系
一个进程包含至少一个或多个线程,而一个线程只能属于一个进程。
顺序一致性模型
一、竞态条件(Race Condition)
计算的正确性取决于多个线程
执行的时序
时,就会发生 竞态条件。
二、顺序一致性模型
对内存可见性的保证 对多线程并发时的串行化保证
顺序一致性模型的两大特征:
- 一个线程中的所有操作必须按照程序的顺序来执行。
- (不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。在顺序一致性内存模型中,每个操作都必须原子执行且立刻对所有线程可见。
在概念上,顺序一致性模型有一个单一的全局内存,这个内存通过一个左右摆动的开关可以连接到任意一个线程。同时,每一个线程必须按程序的顺序来执行内存读/写操作。从上图我们可以看出,在任意时间点最多只能有一个线程可以连接到内存。当多个线程并发执行时,图中的开关装置能把所有线程的所有内存读/写操作串行化。
- 为了更好的理解,下面我们通过两个示意图来对顺序一致性模型的特性做进一步的说明:
假设有两个线程A和B并发执行。其中A线程有三个操作,它们在程序中的顺序是:A1->A2->A3。B线程也有三个操作,它们在程序中的顺序是:B1->B2->B3。 假设这两个线程使用监视器来正确同步:A线程的三个操作执行后释放监视器,随后B线程获取同一个监视器。那么程序在顺序一致性模型中的执行效果将如下图所示: