在什么情况下,空的同步块可以实现正确的线程语义?


问题内容

我正在查看基于我的代码库的Findbugs报告,并且触发的模式之一是空synchronzied块(即synchronized (var) {})。该文件说

空同步块比大多数人认识到的要微妙得多,难以正确使用,并且空同步块几乎从来没有比不那么人为的解决方案更好的解决方案。

就我而言,它的发生是因为该块的内容已被注释掉,但是该synchronized语句仍然存在。在什么情况下,空synchronized块可以实现正确的线程语义?


问题答案:

空的同步块将等待,直到没有其他人正在使用该同步器。那可能就是您想要的,但是因为您没有保护同步块中的后续代码,所以没有什么可以阻止其他人修改在运行后续代码时正在等待的内容。那几乎不是您想要的。