其实这些就是 Java 内存模型封装了底层的实现后提供给程序员使用的一些关键字。
在开发多线程的代码的时候,我们可以直接使用 Synchronized 等关键字来控制并发,这样就不需要关心底层的编译器优化、缓存一致性等问题。
java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节。乎听起来不算啥,但是它的作用非凡,因为自定义标签之所以叫自定义就是每个人都可以自己来定义,如果没有一个规范必然产生混乱,而且一套完善的自定义标签是个系统工程,一套完整的自定义标签相当于我们在自己定义一套新的开发语言,做程序的人听到这个一定就会明白开发一套完整的自定义标签的工作量和开发难度都是难以想象的,而且自定义标签都是和控制层紧密相连,其难度又会增加一个维度,所以struts2提供的自定义标签对于业务开发带来的将是质的飞越。在聊聊高并发(三十三)从一致性(consistency)的角度理解java内存模型 我们说了硬件层提供了满足某些一致性需求的能力,java内存模型利用了硬件层提供的能力指定了一系列的语法和规则,让java开发者可以隔绝这种底层的实现专注于并发逻辑的开发。
我们前面提到,并发编程要解决原子性、有序性和一致性的问题。下面我们就再来看下,在 Java 中,分别使用什么方式来保证。
原子性
在 Java 中,为了保证原子性,提供了两个高级的字节码指令 Monitorenter 和 Monitorexit。
在 Synchronized 的实现原理文章中,介绍过,这两个字节码,在 Java 中对应的关键字就是 Synchronized。
因此,在 Java 中可以使用 Synchronized 来保证方法和代码块内的操作是原子性的。
可见性
Java 内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值的这种依赖主内存作为传递媒介的方式来实现的。
Java 中的 Volatile 关键字提供了一个功能,那就是被其修饰的变量在被修改后可以立即同步到主内存。
被其修饰的变量在每次使用之前都从主内存刷新。因此,可以使用 Volatile 来保证多线程操作时变量的可见性。
由2.1可知,要编写正确的并发程序,关键问题在于:在访问共享的可变状态时需要进行正确的管理,这里正确的管理主要解决竞态条件和数据竞争(主要包括对象可见性)问题,我们知道同步方法和同步代码可以确保以原子的方式执行操作,因此错误的会认为synchronized只能用于实现原子性和确定临界区(critical section)即解决竞态条件问题,其实同步还有重要的一方面就是内存(对象)的可见性(visibly)。当a线程调用anyobject对象加入synchronized关键字的x方法时,a线程就获得了x方法锁,更准确地讲,是获得了时象的锁,所以其他线程必须等a线程执行完毕才可以调用x方法,但b线程可以随意调用其他的非synchronized同步方法。1.关键字volatile是线程同步的轻量级实现,性能肯定比synchronized要好,volatile修饰于变量,synchronized可以修饰方法,随着jdk新版本的发布,synchronized在执行效率得到了很大提升,在开发使用比率还是比较大。
有序性
在 Java 中,可以使用 Synchronized 和 Volatile 来保证多线程之间操作的有序性。
2)允许jvm指令重排序,但是禁止其他线程知道该线程进行过重排序,即其他线程对重排序不可见。java线程之间的通信总是隐式进行 java并发模型—硬件视图 内存空间 共享对象 共享对象 共享对象 内存中的jvm 对象 程之间共享 线程1 线程2 处理器a 处理器b 处理器c 处理器d java并发模型—操作系统视图 jvm进程 hotspot vm中, java线程被 java线程 java线程 java线程 映射为本地操作系 统线程 linux kernel 操作系统内核 直接调度java 线程给可用的cpu处理器a 处理器b 处理器c 处理器d 编译器和处理器喜欢不择手段的冒险源代码 编译器优化 指令级并行 内存系统的 最终执行的 的重排序 的重排序 重排序 指令序列 编译器的 重排序 重排序 指令级并行的 处理器的 重排序 重排序 内存系统的 重排序 顺序一致性内存模型的原型结构 处理器a 处理器b 处理器c 处理器c a3 b2 d1 程序顺 a2 b1 c3 d2 序不变 a1 c2 每个内存 c1 单元一个 fifo队列内存单元 1 2 3 4 5 6 7 8 9 10 11 12 13 … … n顺序一致性内存模型的程序员视图 线程 线程 线程 线程 … 2 3 n 1 内存 顺序一致性内存模型的2 大特性 特性2 线程a 的程序顺序 操作的执行整体上无序,但两个线程 都只能看到这个执行顺序。控制这个mpm的最重要的指令是,控制每个子进程允许建立的线程数的threadsperchild指令,和控制允许建立的总线程数的maxclients指令。
好了,这里简单的介绍完了 Java 并发编程中解决原子性、可见性以及有序性可以使用的关键字。
读者可能发现了,好像 Synchronized 关键字是万能的,它可以同时满足以上三种特性,这也是很滥用 Synchronized 的原因。
但是 Synchronized 是比较影响性能的,虽然编译器提供了很多锁优化技术,但是也不建议过度使用。
总结
本 文 由 第 一 公 文 网 g o n g w e n . 1 k e j i a n . c o m 收 集 整 理 5 “坚持根本宗旨、发挥党员作用”发言稿:牢记根本宗旨,发挥应有作用。在美国人看来,市长更多应该是体验民情,应该20多岁到社区服务、社区演讲,了解平民百姓的疾苦,读完博士应该去做研究。1.开机久了,虽然有"系统加速精灵"在加速,但照旧应该注意收拾整顿一下内存,如今内存东西网上有很多,各人可以本挑选出的人,"windows优化巨匠"自带的内存东西,很都忽略了这个功能这个东西还可以独自给予优待化巨匠中分离出来(就是优化巨匠安装目次下的"winmem.exe",直接复制出来便可运用),倘使你想卸载优化巨匠但想用这个,可以卸载前先复制出来。
作者:Hollis
但是还有个前提,那就是你提供参考的个人博客、公众号或qq空间的文章要是原创的,起码你要改成是“原创”的。4.博客推广:博客是一个很好的推广工具,大家可以试下,个人博客不像公众论坛, 大家可以随便在自己的博客上做任何广告,可以把自己的店铺连接放上去,也可以把商品图片、宝贝描述都放上去,平时多写些日志文章,这样就能带来不少流量。4、博客推广:博客是一个很好的推广工具,大家可以试下,个人博客不像公众论坛,大家可以随便在自己的博客上做任何广告,可以把自己的店铺连接放上去,也可以把商品图片、宝贝描述都放上去,平时多写些日志文章,这样就能带来不少流量。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-109489-3.html
不要瞎说