调用者会阻塞,直到 getFoo() 准备好值为止?

2023-11-23

我有一个JavaThread它公开了其他线程想要访问的属性:

class MyThread extends Thread {
   private Foo foo;
   ...
   Foo getFoo() {
     return foo;
   }
   ...
   public void run() { 
     ...
     foo = makeTheFoo();
     ...
   }
}

问题是从运行到执行需要花费很短的时间foo可用。来电者可以致电getFoo()在此之前并获得null。我宁愿他们简单地阻塞、等待,并在初始化发生后获取值。 (foo此后永远不会更改。)准备就绪只需几毫秒,因此我对这种方法感到满意。

现在,我可以让这一切发生wait() and notifyAll()我有 95% 的机会做对。但我想知道你们会怎么做?是否有一个原语java.util.concurrent那会做这个,我错过了?

或者,您将如何构建它?是的,使foo易挥发的。是的,在内部锁上同步Object并将支票放入while循环直到不是null。我错过了什么吗?


If foo仅初始化一次,aCountDownLatch非常合适。

class MyThread extends Thread {

  private final CountDownLatch latch = new CountDownLatch(1);

  ...

  Foo getFoo() throws InterruptedException
  {
    latch.await(); /* Or use overload with timeout parameter. */
    return foo;
  }

  @Override
  public void run() {
    foo = makeTheFoo()
    latch.countDown();
  }

}

锁存器提供与volatile关键字,意味着读取线程将看到的值foo由线程分配,即使foo未声明volatile.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调用者会阻塞,直到 getFoo() 准备好值为止? 的相关文章

随机推荐

  • 您能推荐一个商业用途的地图API吗?

    我的要求是能够打印许多节点之间的路线 能够查询节点之间的距离以进行最佳可能的路线计算 并在地图上显示自定义图标 就道路和街道而言 拥有准确的地图源非常重要 我调查了开放的街道地图 但恐怕它可能不完全准确 任何有关商业库 API 的建议将不胜
  • 带参数的 jQuery 绑定和取消绑定事件

    我正在尝试将事件绑定到textbox包含参数 下面的 keep 看起来似乎应该这样做 但每次页面加载时 它都会被执行 jQuery function jQuery textbox bind click EventWithParam para
  • 拉伸背景图片CSS?

    td class style1 align center height 35 div style width 230px a class link span span a div td
  • 用于语义分割的 ImageDataGenerator

    我正在尝试使用 Keras 进行语义分割 并且在尝试加载图像时出现此错误flow from directory method Found 0 images belonging to 0 classes Found 0 images belo
  • 连接两条线段

    给定两条 2D 线段 A 和 B 如何计算连接 A 和 B 的最短 2D 线段 C 的长度 考虑两条线段 A 和 B 分别由两个点表示 线A由A1 x y A2 x y 表示 线 B 由 B1 x y B2 x y 表示 首先使用此算法检查
  • 如何迭代 JSON 结构? [复制]

    这个问题在这里已经有答案了 我有以下 JSON 结构 id 10 class child of 9 id 11 classd child of 10 如何使用 JavaScript 迭代它 var arr id 10 class child
  • 为什么 lambda 中的短路不起作用?

    为什么 linq 仍然尝试检查第二个表达式 Where t gt String IsNullOrEmpty someNullString t SomeProperty gt Convert ToDecimal someNullstring
  • 如何使用 Spring Boot 和嵌入式 Tomcat 禁用 TLSv1.0?

    我想用 spring boot 版本 1 3 3 停用 TLS 1 0 但如果 application yml 如下所示 它不起作用 ssl protocol TLSv1 2 key store E key server jks key s
  • 用于批量插入的触发触发器

    ALTER TRIGGER dbo TR O SALESMAN INS ON dbo O SALESMAN AFTER INSERT AS BEGIN SET NOCOUNT ON added to prevent extra result
  • 我应该扩展 ArrayList 以添加不为 null 的属性吗?

    我想将对象集合添加到 arrayList 前提是特定属性不为空 我正在考虑扩展 ArrayList 并在子类中实现检查 一种替代方法是在将属性放入 Arraylist 之前检查该属性 但这意味着 如果我需要根据逻辑将对象添加到 arrayl
  • 什么是 UIViewController

    我知道什么是UIView是但不是UIViewController 我只是想知道我可以用它做什么 以及它与UIView 基本上你需要知道什么是模型 视图 控制器架构在软件工程领域 UIView对应于该架构的视图并且UIViewControll
  • 带有手动词法分析器的 ANTLR 解析器

    我正在将基于 C 的编程语言编译器从手动词法分析器 解析器迁移到 Antlr Antlr 一直让我头疼 因为它通常mostly可以 但有些小部分却不能 而且解决起来非常痛苦 我发现我的大部分头痛都是由 Antlr 的词法分析器部分引起的 而
  • Twisted 的 Python Jabber/XMPP 客户端库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在寻找一个使用 Twisted 框架编写 Jabber XMPP 客户端的 Python 库 Wokkel是你最好的选择 它是对 Twisted 内置的核心 Twisted Wo
  • document.body.scrollHeight 在 firefox/chrome 中产生两个不同的结果

    我试图访问整个页面的高度 包括滚动 在 Chrome 中 document body scrollHeight 就是这样做的 在 Firefox 中 这不起作用 Firefox 中的等效项是什么 肯定开始使用 jquery 访问 docum
  • 如何在ie11上查看webp格式

    有没有办法在 IE11 上查看 webp 图像格式 或者可以在此浏览器上使用 javascript 代码将其转换为其他格式 我尝试了 图片 元素 但似乎它不能像 Chrome 62 那样工作 This也是一个非常易于使用且有效的polyfi
  • 如何使屏幕的表格居中(垂直和水平)

    我有这些代码块 table border 1px tr td my content td tr table 我想在屏幕中央显示我的表格 垂直和水平 这是一个演示 我怎样才能做到这一点 水平居中很容易 您只需将两个边距设置为 自动 table
  • Union-Find:有效检索集合的所有成员

    我正在与一个union find算法 在我的程序的第一部分中 算法计算一个大集合的分区E 之后 我想检索该集合的所有成员S 其中包含给定节点x 到目前为止 我天真地测试了所有元素的成员资格E到集合S 但昨天我正在阅读 算法导论 CLRS 着
  • 如何设置相对于祖父母元素而不是直接父元素的宽度?

    我正在尝试设置一些元素的宽度相对于祖父母元素宽度的百分比 像这样 div class grand div class parent div class child1 div div class div div div
  • Sonar:如何使用 try-with-resources 关闭 FileOutputStream

    声纳给出一个错误 这FileOutputStream应该关闭 我需要修改以下代码才能使用try with resources 我该怎么做呢 public void archivingTheFile String zipFile byte b
  • 调用者会阻塞,直到 getFoo() 准备好值为止?

    我有一个JavaThread它公开了其他线程想要访问的属性 class MyThread extends Thread private Foo foo Foo getFoo return foo public void run foo ma