说说Java中原子性,可见性与指令重排序的理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lxlmycsdnfree/article/details/71079057

原子性:就是读数据,处理数据,写数据 这三个步骤不能被终止,或者打断;就是不能被线程调度器中断,切换线程。


这样,才能保证,原子操作在线程切换,并行处理上保证数据地顺序累加处理。

可见性:是Jvm较为突出的概念,其每一个线程有自己的工作内存空间,当某一个线程读取了主内存的数据,那么会通知其他线程中自己的内存空间此数据被加屏障,不可读;只能再次从主内存读数据缓存到自己的内存空间。这个概念在Java volitile 关键字体现的,其他系统的这种线程交互机制也应该类似。

指令重排序:


处理器在核心计算区有算术计算芯,逻辑(与或逻辑)计算和位处理。比如:

if(i > 6)
{
  a = b + c;
}
含有计算且被逻辑条件包含的代码指令,一般在处理器上,先是在算术计算中心计算数据后放入高速缓存中;然后当逻辑条件成立后,才会写回到内存中。原因就是cpu有不一样的计算区,这也是提高CPU计算能力的方式。基于此原理,那么有了指令的重排序。对于并发系统,那么可能出现逻辑混乱现象,但是对于单线程,不存在这个问题。指令重排序是内核做的,所以jvm会和系统内核交互不让其指令重排序。


对于多处理器的并发系统,那么即使遵循上面的三个原则,也是不是出现并发逻辑问题呢?

由于多个处理器,那么可以并发地读主内存数据,然后处理写回数据,这样就会出现逻辑混乱问题。那么在多cpu系统,对于多线程处理同一个方法的任务的时候,调度器只允许一个cpu处理执行其中的一个线程。其他的线程都在等待区,等待前一个线程执行完,才会被调度,交给当前或者其他处理器处理。也就是保证了同一块指令多线程处理的单CPU的顺序执行。



展开阅读全文

没有更多推荐了,返回首页