as-if-serial规则:顺序执行的魔法 小杰首先回忆起自己在学习Java内存模型时看到的一个关键点:as-if-serial规则。他回忆道,这个规则其实来源于Java的内存模型,它描述了并发执行中的顺序一致性。as-if-serial规则要求,对于一个多线程的Java程序,尽管我们在物理上使用多个线程并行执行,但Java的内存模型允许JVM对指...
as-if-serial规则:侧重于Java程序的外部行为,它确保多线程并发执行时,程序的行为不会违背串行执行的逻辑。 happens-before规则:侧重于线程间的数据同步,它保证了线程之间的数据在正确的顺序下传递,避免出现数据竞争和脏数据。 3、应用场景不同: as-if-serial规则:更多地应用于JVM对指令的优化和重排序,确保优化不会...
as-if-serial 程序在单线程执行的时候,执行结果有时候与程序语句的顺序是有很大关联的。比如下面这个例子: intr =3; //1intj = r-1; //2intm = r*r; //3 程序能得到正确执行结果与语句的顺序相关联。所以指令重排序要保证单线程下java程序运行结果与语义的结果要一致,细节不用关心,可能内部也做了优化或...
We extend this model to provide as-if-serial exception handling semantics. Using this model our runtime delivers exceptions to the same point it would deliver them if the program was executed sequentially. We present the design and implementation of our approach and evaluate its efficiency using ...
硬声是电子发烧友旗下广受电子工程师喜爱的短视频平台,推荐带你了解Java编程中的as-if-serial语义 视频给您,在硬声你可以学习知识技能、随时展示自己的作品和产品、分享自己的经验或方案、与同行畅快交流,无论你是学生、工程师、原厂、方案商、代理商、终端商...上
5.2as-if-serial语义把单线程程序保护了起来,遵守as-if-serial语义的编译器,runtime和处理器共同为编写单线程程序的程序员创建了一个幻觉:单线程程序是按程序的顺序来执行的。as-if-serial语义使程序员不必担心单线程中重排序的问题干扰他们,也无需担心内存可见性问题。
as-if-serial语义把单线程程序保护了起来,遵守as-if-serial语义的编译器,runtime 和处理器共同为编写单线程程序的程序员创建了一个幻觉:单线程程序是按程序的顺序来执行的。as-if-serial语义使单线程程序员无需担心重排序会干扰他们,也无需担心内存可见性问题。
为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。但是,如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序。 happens-before 原则 只靠sychronized和volatile关键字来保证原子性、可见性以及有序性,那么编写并发程序可能会显得十分麻烦,...
回来看下我们出问题的双重检查锁程序,它是满足as-if-serial语义的吗?是的,单线程下它没有任何问题,但是在多线程下,会因为重排序出现问题。 解决方案就是大名鼎鼎的volatile关键字,对于volatile我们最深的印象是它保证了”可见性“,它的”可见性“是通过它的内存语义实现的: ...
这就是as-if-serial语义。在多线程情况下有一套更具体的规则,那就是happens-before原则。 happens-before由以下八大原则组成: 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作(线程的执行结果有序) 锁定规则:一个unlock操作先行发生于后面对同一个锁的lock操作 volatile变量规则:...