java内存模型和线程

概述

多任务的处理在现在的计算机中可以说是“标配”了,在许多的情况下,让计算机同时做几件事情,不仅是因为计算机的运算能力的强大,还有一个重要的原因是:cpu的运算速度和计算机的存储以及通讯子系统的相差的比较大,大部分的时间都花在了磁盘I/O,网络通信和数据库访问上面了,为了充分的利用资源,具体的说就是为了充分的利用cpu的“计算资源”。

高并发的一个典型的应用场景就是:一个服务端同时对多个客户端提供服务。其中的指标TPS (每秒事务处理数) 代表着一秒内服务端平均能响应请求的总数。这个指标就和服务端具体的程序的编写有相当大的关系,服务端的程序县城并发协调得越有条理,效率自然会高。反之,线程之间频繁阻塞甚至死锁,就会大大的降低程序的并发能力,相应的指标也就会降低。

一致性和硬件的效率

首先我们花一部分的时间了解一下物理计算机中并发问题。

java内存模型和线程

具体的图为:

java内存模型和线程

和具体的java内存模型相对比的是:

java内存模型和线程

然后就是相对来说,栈中的工作内存和堆中的主内存是怎么保持一致的?

java内存模型和线程

java内存模型和线程

然后JVM针对这些操作制定了一系列的规范,最终保证工作内存和主内存的一致性。具体的是:

java内存模型和线程

这个是缓存一致性协议。

volatile 是怎么样的一个逻辑:

java内存模型和线程

由此可以看到,read and load 从主存复制变量到当前工作内存 use and assign  执行代码,改变共享变量值  store and write 用工作内存数据刷新主存相关内容

其中use and assign 可以多次出现 但是这一些操作并不是原子性,也就是 在read load之后,如果主内存count变量发生修改之后,线程工作内存中的值由于已经加载,不会产生对应的变化,所以计算出来的结果会和预期不一样

对于volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的

例如假如线程1,线程2 在进行read,load 操作中,发现主内存中count的值都是5,那么都会加载这个最新的值 在线程1堆count进行修改之后,会write到主内存中,主内存中的count变量就会变为6 。线程2由于已经进行read,load操作,在进行运算之后,也会更新主内存count的变量值为6 。导致两个线程及时用volatile关键字修改之后,还是会存在并发的情况。

上一篇:Linux命令行下编译Android NDK的示例代码


下一篇:ExtJs 4.2.1 点击按钮弹出表单的窗口