Java Thread Synchronized对象用于等待并通知

时间:2015-08-13 07:12:21

标签: java multithreading synchronization

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

synchronized(some_object){
   wait();
}

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

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

为什么我应该在这两个不同的类中使用同一个对象进行同步块。因为我读同步已经习惯了

  

“已同步”关键字阻止对块的并发访问   多个线程的代码或对象。

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

我的问题

  • 我们可以为单线程环境使用不同的锁定对象(synchronized(object))吗?
  • 当我们等待并在不同的班级通知时,最好的方法是使用相同的锁定对象吗?

3 个答案:

答案 0 :(得分:1)

  

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

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

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

  

当我们等待并在不同的类中通知时,最好的方法是使用相同的锁定对象吗?

当您通知()时,您必须执行状态更改。当你在循环中wait()时,你会检查那个状态变化。如果你不这样做,你可能有两个问题。

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

答案 1 :(得分:0)

  

当没有数据要处理时,它应该调用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.
}

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

  • 当多个消费者竞争相同的待处理事物时,您不会遇到麻烦。
  • 由于虚假唤醒
  • ,您不会遇到麻烦
  • 由于丢失通知问题,您不会遇到麻烦。

答案 2 :(得分:0)

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