用于等待和通知的Java线程同步对象

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

synchronized(some_object){
   wait();
}

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

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

为什么我应该在这两个不同的类中为同步块使用相同的对象。 正如我读同步习惯

“同步”关键字阻止多个线程同时访问一段代码或对象。

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

我的问题

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

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

    在单线程环境中,您不需要锁。 你可以使用任何你想要的或者什么都没有。

    在单线程环境中,您可以保证没有线程处于等待状态,因此notify()将不会执行任何操作。

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

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

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

  • 当没有数据要处理时,应该调用wait。

    不是当,而是一会儿。

    等待和通知是低级别的基本操作,这些操作意图以非常特定的方式使用。

    在消费者线程中:

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

    在生产者线程中:

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

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

  • 当多个消费者竞争同一件待处理的东西时,您不会遇到麻烦,
  • 你不会因为虚假的唤醒而陷入麻烦,而且
  • 由于通知问题丢失,您不会遇到麻烦。
  • 链接地址: http://www.djcxy.com/p/76253.html

    上一篇: Java Thread Synchronized object for wait and notify

    下一篇: Can a synchronized block/method be interrupted?