当前位置: 首页 > 后端技术 > Java

Mailinator(tm)博客美丽的比赛条件

时间:2023-04-01 19:17:16 Java

来源:TheMailinator(tm)Blog:ABeautifulRaceConditionBegin主题是为什么多线程编程(多线程编程)看起来很容易,但结果却如此困难。有趣的部分是我调查了(调查)(根据我的上一篇文章和这篇文章)几个我知道存在但想了解更多的旧的个人并发恶魔。其中一个确实是我最喜欢的竞争条件。它并没有逃避(逃避)我,它可能完全(完全)不健康,甚至有一个最喜欢的种族条件(类似于有一个最喜欢的疙瘩(瘩)或其他东西)-但尽管如此(然而),优雅(优雅)这个仍然让我心潮澎湃。这场比赛的场景(场景)是我们假设(假设),不是非常不准确(准确定),比赛条件有时会导致损坏(腐败)数据。但是,如果我们遇到某种不介意某些损坏数据的情况怎么办?一个“足够好”的应用程序。所有这一切的危险部分是如果我们假设(不深入)什么样的data可能会发生。正如你所看到的,你可能只是没有得到你所希望的数据损坏类型(这是我写过的最愚蠢的句子之一)。那就是-两个之间的竞争条件(或更多)线程可能会意外(偶尔)丢弃一个条目,导致额外的缓存未命中——没什么大不了的(无足轻重)。或者,它可能会导致一个线程重新缓存不需要它的条目。也没什么大不了的。换句话说,稍微不精确(略微不准确),但非常快的缓存对他们来说是可以的。(当然,这个假设是完全错误的-不要那样做-继续阅读为什么!)MainSo他们以某种全局方式(做法)设置(设置)一个HashMap,并允许任意数量的邪恶(邪恶)线程爆炸在上面。让他们尽情发挥。ResizeNow如果你碰巧知道HashMap是如何工作的,如果地图的大小超过(超过)给定的阈值,它会采取行动调整地图的大小。它通过创建一个两倍于先前(之前)大小的新桶数组,然后将每个旧的e元素到新的桶数组中。这是执行调整大小的循环的核心:1://java.util.HashMap中的传输方法-2://调用以调整哈希图的大小3:4:for(intj=0;j