java - 当我尝试倒计时时同步被阻塞

标签 java multithreading concurrency countdownlatch

我关注了the advice I found in this post使用 CountDownLatch 我遇到了问题。我编写了这个测试并运行它,当我尝试同步锁定时,我的线程创建了 block 。

  private CountDownLatch lock = new CountDownLatch(1);

  @Test
  public void testBlock() {
    Runnable r = new Runnable() {
      @Override
      public void run() {
        try
        {
          synchronized(this) {
            this.wait(50);
          }
        }
        catch (InterruptedException e)
        {
          e.printStackTrace();
          throw (new RuntimeException(e));
        }
        releaseLock();
      }
    };

    Thread t = new Thread(r);
    t.setDaemon(true);
    t.start();

    waitOnCallback();
  }

  private void releaseLock() {
    synchronized(lock) { // Thread t blocks here
      lock.countDown();
    }
  }

  private void waitOnCallback() {
    synchronized(lock) {
      try
      {
        lock.await();
      }
      catch (InterruptedException e)
      {
        throw new RuntimeException(e);
      }
    }
  }

为什么这不起作用?

最佳答案

CountDownLatch 不是需要同步的对象(即删除 synchronized(lock) block )。所有线程安全都在对象本身内部处理。

关于java - 当我尝试倒计时时同步被阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11007551/

相关文章:

java - 当我在 android 中取消选择甚至 1 个复选框时如何取消选择全选复选框

java - Tinkerpop3 连接到远程 TitanDB 服务器

c# - 向任务添加状态时出现问题

java - 线程间通信

c# - 如何获取 "Everyone"的 IdentityReference 以在本地化系统上创建 MutexAccessRule?

java - 为什么我的 JTextArea 没有更新?

java - 返回 StringBuilder 或 StringBuffer 的 StringUtils.replaceEach?

java - 如何从 Hazelcast 的 Imap 中检索序列化对象?

Python:在多线程应用程序中为每个线程打印单独的 bash 行

c++ - C++11 可变数量的异步线程