当前位置: 首页 > 面试题库 >

如果完全像compareAndSet那样实现weakCompareAndSet会失败吗?

劳法
2023-03-14
问题内容

(请注意,此问题不是关于CAS的,而是关于 “可能偶然失败”的 Javadoc)。

AtomicInteger该类中这两个方法之间Javadoc的唯一区别是, weakCompareAndSet 包含以下注释:
“可能会虚假失败”

现在,除非我的眼睛被某种咒语欺骗,否则这两种方法的确看起来完全一样:

public final boolean compareAndSet(int expect, int update) {
  return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

/* ...
 * May fail spuriously.
 */
public final boolean weakCompareAndSet(int expect, int update) {
  return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

因此,我意识到“ May”并不意味着“ Must”,但是为什么我们不都开始将其添加到我们的代码库中:

public void doIt() {
    a();
}

/**
 * May fail spuriously
 */
public void weakDoIt() {
    a();
}

我真的与混淆 weakCompareAndSet() ,似乎做同样的 compareAndSet() 还认为“可能会意外失败”,而另一个不能。

显然,“弱”和“虚假失败”与“先发生”排序有关,但是我对这两种AtomicInteger(和AtomicLong等)方法仍然感到困惑:
因为显然它们调用的是完全相同的 不安全方法.compareAndSwapInt 方法

我对AtomicIntegerJava 1.5中引入的内容感到特别困惑,因此在Javahtml" target="_blank">内存模型更改之后(因此,它显然不会 “在1.4中错误地失败”,
但其行为更改为 “在1.5中不会错误地失败” )。


问题答案:

实现和规范之间有区别…

尽管在特定的实现上,提供不同的实现可能没有多大意义,但是未来的实现可能在不同的硬件上可能想要。此方法是否在API中发挥作用还是有争议的。

同样,这些weak方法没有 定义顺序 之前发生 。非weak版本的行为类似于volatile字段。



 类似资料:
  • 问题内容: 我正在使用MySQL 5.5,所以这就是为什么我不能使用FULLTEXT搜索的原因,所以请不要提出建议。 我想做的是,如果用户我有5条记录,例如: 如果有人搜索Ami,则应首先返回Ami作为完全匹配项,然后返回Amit&Amitesh 问题答案: 你可以做:

  • 我从eclipse.org下载了。并且我更改了上的主题。但这不是我想要的。 我如何做完全黑暗?

  • 我正在运行一个内存密集型应用程序。一些关于环境的信息: 64位debian 13 GB RAM 64位JVM(我的程序运行时输出System.getProperty("sun.arch.data.model"),它说"64") 下面是我发出的确切命令: Java-xmx 9000m-jar " ale . jar " test config 我已经用同样精确的数据、配置等运行了程序。在其他几个系统

  • 我创建了一个声明性管道 使用maven构建神器 将工件上传到Nexus存储库 使用的插件-Nexus工件上传器插件 Nexus-Sonatype NexusOSS 3.17 但是在这里,当上传神器到nexus repo失败时,管道没有失败,它显示为成功。我查了一下,很多其他人都报告了这个问题。 那么,如果上传失败,我可以在这里添加任何解决方法,使我的管道失败吗? 我已经附上了发布神器阶段和截图 控

  • 麦克卡特琳娜10.15.6 我已经安装了npm。我想升级,所以运行了以下命令。

  • 我正在使用此代码从网络加载图像。 我同时发出多个请求,因此出现错误,但该文件实际上存在于服务器上。 因此,我想问,如果glide失败,我如何重试glide请求? 我研究了这个讨论,如果Glide失败,如何重试图像加载?但这没有帮助。 错误日志 类com。邦普泰克。滑行负载发动机GlideException:加载资源失败原因1:java。木卫一。FileNotFoundException(无内容提供