加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 调用者阻塞直到getFoo()有一个值准备好了?

发布时间:2020-12-14 16:34:06 所属栏目:Java 来源:网络整理
导读:我有一个 Java线程暴露了其他线程要访问的属性: class MyThread extends Thread { private Foo foo; ... Foo getFoo() { return foo; } ... public void run() { ... foo = makeTheFoo(); ... }} 问题是,从运行时间到可用的时间需要一些时间.调用者可以在此
我有一个 Java线程暴露了其他线程要访问的属性:
class MyThread extends Thread {
   private Foo foo;
   ...
   Foo getFoo() {
     return foo;
   }
   ...
   public void run() { 
     ...
     foo = makeTheFoo();
     ...
   }
}

问题是,从运行时间到可用的时间需要一些时间.调用者可以在此之前调用getFoo()并获取一个null.一旦初始化发生,我宁愿他们只是阻止,等待并获取该值. (foo从来没有改变过).直到它准备好了,这将是毫秒级的,所以我很乐意用这种方法.

现在,我可以通过wait()和notifyAll()发生这种情况,有95%的机会我会做的.但我想知道你们会怎么做?是否有一个原始的java.util.concurrent将这样做,我错过了?

或者,你将如何构建它?是的,使foo挥发.是的,在内部锁对象上进行同步,并将检查放在while循环中,直到它不为空.我错过了什么吗?

解决方法

如果foo只被初始化了一次,那么 CountDownLatch是非常适合的.
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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读