【问题标题】:synchronized block/method without wait() and notify() notifyAll() methods没有 wait() 和 notify() notifyAll() 方法的同步块/方法
【发布时间】:2019-02-19 03:02:12
【问题描述】:

我最近遇到一个代码,在方法声明中使用了 synchronized 关键字,但在方法定义中没有使用 wait()、notify()、notifyAll() 方法。

我的问题是,据我所知,同步块或方法在处理多线程交互时使用 wait()、notify()、notifyAll() 方法进行线程间通信。所以有可能有一个同步块或方法中没有 wait()、notify() 或 notifyAll() 方法。

谢谢

【问题讨论】:

  • 是的,有可能,该块一次只能由一个线程执行
  • '在方法声明中使用了同步关键字' - 这样这种方法不会被不同的线程同时执行,不需要等待/通知,在这种方法中修改的数据对任何竞争都是安全的条件 - 只要它被安全修改
  • 这里有没有可能,如果一个线程执行由于某种原因停止并且所有处于等待状态的线程,无限期地等待而不得到通知?
  • 是的。如果一个线程在同步方法中存在无限循环或永远阻塞,则等待锁的所有其他线程将永远等待。但你为什么要这样做?线程执行不会“因某种原因停止”。
  • 不,我想说的是,如果在执行某些操作或某些缓慢的数据库操作时抛出异常(没有正确处理),到那时等待线程将处于等待状态状态而不得到通知

标签: java multithreading java-8 thread-safety deadlock


【解决方案1】:

必须始终从同步块中调用wait(), notify() and notifyAll()。但这并不意味着同步块应该总是有这些方法之一。

【讨论】:

    【解决方案2】:

    synchronized 块(或synchronized 方法)的目的是防止线程在访问共享数据时相互干扰。 wait()notify()notifyAll()的目的是协调两个或多个线程的动作。

    但是,仅仅因为两个或多个线程需要访问相同的共享数据,并不总是意味着它们需要相互协调以实现共享目标。有时,他们只要不妨碍对方就足够了。这就是synchronized 所做的——它使线程不会相互干扰。

    另外,请注意:仅仅因为您没有看到明确的等待/通知调用,这并不意味着它们不存在。有时线程通过使用可能在其实现中使用等待/通知(或something equivalent to wait/notify)的更高级别的同步对象(例如,BlockingQueue)进行协调。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 2013-02-23
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多