在 chapter 17 of Java language specification年,有一个部分解释为什么“前后一致性不足”.这里是例子:
At first,x = y = 0
Thread 1            | Thread 2
r1 = x;             | r2 = y; 
if (r1 != 0) y = 1; | if (r2 != 0) x = 1;

这里有一个可能的执行痕迹:

r1 = x;  // sees write of x = 1
y = 1;
r2 = y;  // sees write of y = 1
x = 1;

怎么会这样呢?我感到困惑的是,当第一个动作看到x = 1时,这并不意味着条件r2!= 0成为真,因此y已被分配给1.但是按照这个顺序,y = 1在r1 = x之后.我在哪里弄错了例子?我该如何正确解释这个例子?

解决方法

我相信这个例子在Java规范中的观点是Hans Boehm等人写在 Outlawing Ghosts年,它指出了一些当代语言的记忆模型(Java,C 11,甚至C 14,仍然解决,但没有解决这个问题)的缺陷.

要点是这样:程序按照书面的规则被语言的规则正确同步. (在C中,如果你使用原子变量和memory_order_relaxed到处都是如此)但是,仍然不会发生意外行为.说明Boehm:机器可以推测x的值,例如x为1,然后执行结果分支​​,稍后(大概是当内存终于响应时)验证猜测是否为真.确实发现猜测,因为在另一个线程确实存储x = 1,机器继续并且不回滚推测的执行.

更糟糕的是,cpu真的可以推测任何价值存在.考虑这个修改的例子:

r1 = x                     |  r2 = y
if (r1 != 0) y = r1        |  if (r2 != 0) x = r2

在这种情况下,由于相同的原因,x和y可能会以任何值结束.机器可以推测价值是什么,然后推测继续执行这个假设,后来发现它的猜测是真实的,在谚语的自我实现的预言.

这可能令人放心,目前没有真正的硬件表现如此.但关键是当代语言的记忆模式并不能阻止这种行为.您引用的部分是Java尝试说:“看,我们需要在一致性之前发生,但这个另外奇怪的事情在这里仍然不应该发生”.在非规范性说明1.10 / 25中,C 14对这个问题也有同样的含糊的意见.

在Java中如何理解“发生之前的一致性是不够的”的更多相关文章

  1. Android:为什么我们需要使用R2代替R和butterknife?

    我已经使用butterknife几个月了,我刚刚在其文档中注意到它说:NowmakesureyouuseR2insteadofRinsideallButterKnifeannotations.这是为什么?我一直在使用R,一切都很完美.解决方法使用R2仅用于构建Android库项目.https://github.com/JakeWharton/butterknife#library-projects

  2. JBuilder2005实现重构

    将光标置于元素定义处,按CtrlShiftEnter或都通过右键弹出的菜单,选择FindReferences,JBuilder将工程中所有的引用列在信息窗格中,如下图所示:引用以树形方式组织,这些引用以类为分组节点,其下是具体的引用之处。

  3. JBuilder2005单元测试之捆绑多个用例

    目前我们只为Subsection类生成了一个测试用例,在这节里,我们按照前述的方法,通过TestCase向导为StringUtils类创建一个测试用例代码框架,并编写测试方法,然后将这两个测试用例捆绑组合在一个测试套件中一起运行。你也可以像上一节中的TestSubsection测试用例一样运行它。你可以通过AddRecursively,将指定目录下的所有测试用例一并加入。2.指定测试套件类名。指定测试套件类名接受JBuilder为测试套件所提供的默认类名,按Finish完成该测试套件的创建,其代码如下所示

  4. JBuilder2005单元测试之创建测试固件

    这篇文章主要介绍了JBuilder2005单元测试之创建测试固件

  5. Tomcat5+Mssql server 2000数据库连接池配置之旅

    Tomcat相信大家已经很熟悉了,作为一种免费而强大的javawebserver,得到了很多java爱好者的青睐,最新版本的tomcat5支持servlet2.4和jsp2.0,今天我将采用Tomcat5和Mssqlserver000一起来开始数据库连接池配置之旅。--TheJDBCconnectionurlforconnectingtoyourmssqlserverdB.-->urljdbc:microsoft:sqlserver://loc

  6. JBuilder 2005单元测试之慨述

    因为每个类都必须单独运行,以执行其测试功能,并由开发人员观察测试的正确性。多个测试用例组成一个测试套件一起批量运行,它们就像一个强大的Bug嗅探器,一旦发现Bug就会输出特定的信息报告错误,只要一个测试用例没有通过测试就说明程序中有问题。测试用例中所包含的测试规则完成由你定制,这个测试套件对Bug嗅探的"灵敏度"完全取决于测试用例的测试规则,框架提供编写和运行测试用例的规范性方法。

  7. JBuilder2005单元测试体验之测试配置

    创建运行测试项在一般情况下,你不必为每个测试用例类单独创建一个运行配置项,JBuilder会采用默认的运行配置运行测试用例。在Type中选择Test,对话框下部的窗口调整为测试运行配置的界面。在TestRunner中包含3个测试运行器,分别是JBuilderTestRunner、JUnitSwingUITestRunner和JUnitTestUITestRunner。通过测试运行配置项运行测试用例点击TESTALLDB项,JBuilder使用JUnit的junit.swingui.TestRunner运行

  8. JBuilder2005开发Web应用程序

    JBuilder是一个开放的JavaIDE,它集成了Tomcat、Weblogic等服务器。虽然JDK、Tomcat、Weblogic不断升级,我们仍可以在JBuilder中使用它们的最新版本。本文给出了一个使用Tomcat环境下的数据库连接池DatabaseConnectionPool的例子,说明了用JBuilder开发Web应用的一般步骤,并回答了一些经常遇到的问题。JBuilder2005所带JDK的版本是1.4.2_04-b05,其文件放在目录JBuilder_HOMEjdk1.4下,Tomcat

  9. JBuilder2005单元测试之JUnit框架

    简单的框架JUnit是由ErichGamma和KentBeck开发的开源测试框架,JBuilder集成了这个框架并对此做了扩展。JUnit的测试框架类结构很简单,主要由3个类组成,其类图关系如下图所示:图错误!测试固件1.publicclassMoneyTestextendsTestCase2.{3.privateMoneyf12CHF;//12瑞士法郎4.privateMoneyf14CHF;//14瑞士法郎5.privateMoneyf28USD;//28美国美元6.protectedvoidsetU

  10. PHP 5.6.11 访问SQL Server2008R2的几种情况详解

    这篇文章主要介绍了PHP 5.6.11 访问SQL Server2008R2的几种情况的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部