【发布时间】:2019-02-19 03:02:12
【问题描述】:
我最近遇到一个代码,在方法声明中使用了 synchronized 关键字,但在方法定义中没有使用 wait()、notify()、notifyAll() 方法。
我的问题是,据我所知,同步块或方法在处理多线程交互时使用 wait()、notify()、notifyAll() 方法进行线程间通信。所以有可能有一个同步块或方法中没有 wait()、notify() 或 notifyAll() 方法。
谢谢
【问题讨论】:
-
是的,有可能,该块一次只能由一个线程执行
-
'在方法声明中使用了同步关键字' - 这样这种方法不会被不同的线程同时执行,不需要等待/通知,在这种方法中修改的数据对任何竞争都是安全的条件 - 只要它被安全修改
-
这里有没有可能,如果一个线程执行由于某种原因停止并且所有处于等待状态的线程,无限期地等待而不得到通知?
-
是的。如果一个线程在同步方法中存在无限循环或永远阻塞,则等待锁的所有其他线程将永远等待。但你为什么要这样做?线程执行不会“因某种原因停止”。
-
不,我想说的是,如果在执行某些操作或某些缓慢的数据库操作时抛出异常(没有正确处理),到那时等待线程将处于等待状态状态而不得到通知
标签: java multithreading java-8 thread-safety deadlock