【问题标题】:Java Thread Synchronized object for wait and notify用于等待和通知的 Java 线程同步对象
【发布时间】:2015-11-06 00:56:19
【问题描述】:

当我们在线程环境中使用等待和通知时。我有一个类来处理数据作为后台进程。当没有数据需要处理时,它应该调用wait。

synchronized(some_object){
   wait();
}

在另一个类中,我再次添加数据。我需要调用notify() 方法。

synchronized(some_object){
   runnabale_object.notify();
}

为什么我应该在这两个不同的类中对同步块使用相同的对象。当我阅读同步用于

“Synchronized”关键字防止并发访问一个块 多个线程的代码或对象。

但这两个是不同的块。但是当我们使用多个线程时,我可以理解这个问题。而一个线程阻塞另一个线程可以在同一个线程调用通知之前调用通知。

我的问题

  • 我们可以为单线程环境使用不同的锁对象(synchronized(object))吗?
  • 当我们在不同的类中等待和通知时,使用同一个锁对象的最佳方式是什么?

【问题讨论】:

  • 您必须在锁定对象上调用waitnotify(在您的情况下为some_object.wait()some_object.notify())!
  • 您的代码实际上并不能正常工作,来自the Javadoc 当前线程必须拥有此对象的监视器。(强调我的) .因此,如果您想使用wait/notify,那么等待/通知Thread 必须拥有它正在运行的Object 的监视器。这也回答了您的问题,您必须synchronizing 使用与wait/notify 相同的对象。

标签: java multithreading synchronization


【解决方案1】:

我们可以在单线程环境中使用不同的锁对象(synchronized(object))吗?

在单线程环境中,您不需要锁。你可以使用任何你想要的东西,也可以什么都不用。

在单线程环境中,您可以保证没有线程正在等待(),因此 notify() 不会做任何事情。

当我们在不同的类中等待和通知时,使用同一个锁对象的最佳方式是什么?

当您 notify() 时,您必须执行状态更改。当您在循环中等待()时,您会检查该状态更改。如果你不这样做,你可能会遇到两个问题。

  • notify() 丢失了
  • wait() 虚假唤醒,即没有通知。

【讨论】:

  • 就我而言,当我提到没有数据时,单线程处理数据。我必须保持这个过程,直到有新数据进来。所以我的等待和通知方法是错误的?
  • 对不起,我很困惑。这里单线程环境意味着我要创建一个单线程。所以主线程可以正确地通知创建的线程。显然它是多线程的。 rt?
  • @Exbury 你需要做的改变是 wait() 循环应该检查你是否真的有更多的数据。我假设您只会在添加数据后调用 notify() 。任何常见的数据结构也应该在同步块内更新/读取。顺便说一句,一个线程写入和一个线程读取仍然是一个多线程环境。
【解决方案2】:

当没有数据要处理时,它应该调用等待。

不是什么时候,而是

Wait 和 notify 是 低级原语操作,旨在以非常特定的方式使用。

在消费者线程中:

synchronized(lock) {
    while (thereIsNothingToProcess()) {
        lock.wait();
    }
    processSomething();
}

在生产者线程中:

synchronized(lock) {
    makeSomethingAvailableToProcess();
    lock.notifyAll();    //or lock.notify() if you think you can get away with it.
}

如果你遵循这个确切的模式,那么:

  • 当多个消费者竞争同一个待处理的东西时,您不会遇到麻烦,
  • 您不会因为虚假唤醒而遇到麻烦,并且
  • 您不会因为丢失通知问题而遇到麻烦。

【讨论】:

    【解决方案3】:

    我也有同样的问题,所以我查了一下。两个同步块可以在同一个对象中使用的原因是,'wait()'实际上会释放监视器,以便其他线程可以获得同一个对象的监护人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多