并行和并发
1.并行跟并发有什么区别?
从操作系统的角度来看,线程是CPU分配的最小单位。
并行就是同一时刻,两个线程都在执行。这就要求有两个CPU去分别执行两个线程。
并发就是同一时刻,只有一个执行,但是一个时间段内,两个线程都执行了。并发的实现依赖于CPU切换线程,因为切换的时间特别短,所以基本对于用户是无感知的。
就好像我们去食堂打饭,并行就是我们在多个窗口排队,几个阿姨同时打菜;并发就是我们挤在一个窗口,阿姨给这个打一勺,又手忙脚乱地给那个打一勺。
进程和线程
进程:进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。我所理解的就是,一个服务就是一个进程
线程:线程是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。
操作系统在分配资源时是把资源分配给进程的, 但是 CPU 资源比较特殊,它是被分配到线程的,因为真正要占用CPU运行的是线程,所以也说线程是 CPU分配的基本单位。
比如在Java中,当我们启动 main 函数其实就启动了一个JVM进程,而 main 函数在的线程就是这个进程中的一个线程,也称主线程。
jvm内存
下面的图是上面的图的进一步解释
Java内存模型(JMM)
1.堆和栈都是 在Java语言虚拟机 层面上的.
栈内存线程私有的, 是什么意思呢, 可以理解为每个线程都有自己的一个栈内存, 它们之间互不可见互不影响.
堆内存是线程共享的.就是说每个线程都能共享堆内存的资源.
比如,堆内存有个int age= 1,那么a线程先把 int age =1读取到自己的栈内存中,然后再让int age =2,再把int age =2放回线程共享的堆内存中, 当其他线程去读取age的值时就变成了int age =2;
2.Java内存模型(JMM)定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存
(Main Memory)中,每个线程都有一个私有的本地内存
(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。
明天接着弄明白栈内存到底存了什么, 堆内存到底存了什么.