【问题标题】:Substitute for wait and notify in java在java中替代wait和notify
【发布时间】:2014-09-10 11:19:39
【问题描述】:

在 java 中有没有什么可以替代等待/通知?

我有两个线程:

thread1:
run() {
 while(true) {      
  data = getDataFromDatabase()
  changedData = performSomeChanges(data)
  commitUpdateDataToDatabase(changedDate)
  (send signal to thread2 to start and wait for signal for next repetition)
 }  
}

thread2:
run() {
 while(true) {      
  (wait for signal from thread1)
  data = getDataFromDatabase()
  changedData = performSomeChanges(data)
  commitUpdateDataToDatabase(changedDate)
  (send signal to thread1)      
 }  
}

我想在它们之间进行某种同步。现在我为此目的在特殊的公共对象上使用等待/通知。

【问题讨论】:

  • 观察者模式不能解决你的问题吗?无需依赖同步?或者也许一些期货可能在这里派上用场?
  • 你不能使用waitnotify有什么原因吗?

标签: java synchronization wait notify


【解决方案1】:

首先,实现您的示例的简单方法只使用一个线程:

run() {
    while(true) {
        // old thread 1 code      
        data = getDataFromDatabase()
        changedData = performSomeChanges(data)
        commitUpdateDataToDatabase(changedDate)
        // old thread 2 code
        data = getDataFromDatabase()
        changedData = performSomeChanges(data)
        commitUpdateDataToDatabase(changedDate)
    }  
}

在两个线程之间交替执行没有明显的(对我而言)优势。还有几个明显的缺点;即复杂性,以及同步和线程切换的(较小的)性能影响。


但假设您确实有正当理由在两个线程之间交替,那么有很多方法可以做到这一点:

  • 使用 waitnotify ... 就像您当前所做的那样。 (IMO,没有真正需要找到替代方案。如果使用得当,它们工作得很好!诚然,一些 Java 程序员还没有掌握这一点......)

  • 使用java.util.concurrent.Semaphore 并让每个线程在获取和释放之间交替。

  • 使用java.util.concurrent.Lock 并交替拥有锁。

  • 使用BlockingQueue 并来回传递“令牌”对象。

  • 等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多