java内存模型和线程

摘要:
反之,线程之间频繁阻塞甚至死锁,就会大大的降低程序的并发能力,相应的指标也就会降低。然后JVM针对这些操作制定了一系列的规范,最终保证工作内存和主内存的一致性。线程2由于已经进行read,load操作,在进行运算之后,也会更新主内存count的变量值为6。导致两个线程及时用volatile关键字修改之后,还是会存在并发的情况。

概述

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

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

一致性和硬件的效率

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

image

具体的图为:

image

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

image

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

image

image

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

image

这个是缓存一致性协议。

volatile 是怎么样的一个逻辑:

java volatile1

由此可以看到,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关键字修改之后,还是会存在并发的情况。

免责声明:文章转载自《java内存模型和线程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇将 Spring boot 项目打成可执行Jar包,及相关注意事项(main-class、缺少 xsd、重复打包依赖)iOS UIScrollview代理方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

破解中国电信华为无线猫路由(HG522-C)自己主动拨号+不限电脑数+iTV

中国电信总是把好好的一个路由猫阉割过后放在我的E家套餐里到处兜售(垄断市场也就罢了,还有非常多霸王条款,比方必须使用它们的手机,同一时候最多多少台电脑上网等等),曾经破解过另外一个中国电信的路由猫,非常easy,是通过U盘恢复默认配置就能够了,中国电信我的E家有个套餐用的是华为HG522-C无线路由猫再加上IPTV,前段朋友(年龄一大把了)反映他的电...

【原创】Spring连接、事务代码分析

1.JdbcTemplate 当不使用事务时,jdbcTemplate的模板类,通过 Connection con = DataSourceUtils.getConnection(getDataSource()); 方法,首先去当前线程的上下文中寻找绑定的数据库连接,若没找到,则新建一个连接,即从DataSource中创建一个新的连接: Connecti...

关于对JMM(java内存模型)的个人理解

java内存模型是一种虚拟机规范,它定义了Java内存模型,用于屏蔽各种不同硬件和操作系统访问内存差异,以实现让java程序在各种平台下都能达到一致的并发效果.JMM规范了java虚拟机与计算机内存是如何协同工作的,规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量. 关于主内存与工作内存之间的具体交互协...

【SpringBoot WEB系列】异步请求知识点与使用姿势小结

【SpringBoot WEB系列】异步请求知识点与使用姿势小结 在 Servlet3.0 就引入了异步请求的支持,但是在实际的业务开发中,可能用过这个特性的童鞋并不多? 本篇博文作为异步请求的扫盲和使用教程,将包含以下知识点 什么是异步请求,有什么特点,适用场景 四种使用姿势: AsyncContext 方式 Callable WebAsyncTa...

windows2008 32位 sp2安装蓝牙驱动+蓝牙鼠标thinkpad sl410k 2842esc

1、驱动之家下载驱动:http://drivers.mydrivers.com/drivers/431-172563-Broadcom-Bluetooth-7.0-For-WinXP-32-WinX/。 2、下载Microsoft_BlueTooth_Stack。 3、双击broadcom_bluetooth_v7文件夹内的win32文件夹,双击Inst.e...

在Windows 10中截取截图的6种方式 简介

在Windows 10中截取截图的6种方式 简介 截图对于不同的目的很重要。它可以用于捕获笔记本电脑上的任何内容的截图。所以,如果你使用Windows 10,你可能不知道如何截图,因为它是比较新的。因此,我们展示了5种方式,您可以屏蔽任何东西,特别是如果您使用Windows 10.这里有6种方式在Windows 10中截取截图。 截图工具 Snippin...