java - 如果一个方法是同步的,被调用的方法是否也必须同步?
问题描述
如果一个方法是同步的,被调用的方法是否也必须同步?下面的例子中什么是正确的?
// Only parent method synchronized
public synchronized void parentMethod() {
childMethod1();
}
public void childMethod1() {
childMethod2();
}
public void childMethod2() {
}
// All methods synchronized
public synchronized void parentMethod() {
childMethod1();
}
public synchronized void childMethod1() {
childMethod2();
}
public synchronized void childMethod2() {
}
解决方案
如果一个方法是同步的,被调用的方法是否也必须同步?
不。
没有一般理由需要synchronized
从另一个方法调用一个synchronized
方法。
假设这些方法在同一个对象上同步,那么所有模式都是有效的,具体取决于您要实现的目标:
synchronized
从方法调用synchronized
方法- 从普通方法调用
synchronized
方法 - 从方法调用普通
synchronized
方法 - 从普通方法调用普通方法
除了最后一种情况,被调用的方法将持有目标对象的锁。
(在第一种情况下,看起来好像线程要访问同一个对象两次。事实上,Java 原始锁是可重入的……所以这不是问题。)
如果方法调用在不同的目标对象上,它会变得有点复杂。现在您必须考虑您的应用程序是否需要锁定两个对象。您还需要考虑死锁的可能性。(如果两个线程试图同时获取相同的两个原始锁,但顺序不同,则会出现死锁。)
实际上不可能给出关于哪些方法需要同步的硬性规则1。这取决于方法的作用,以及您是使用原始锁互斥锁还是其他一些机制(Lock
, volatile
, 不可变类型等)来同步和/或确保内存可见性。即使对于原始锁互斥体,您也可以使用块的synchronized
方法synchronized
来实现相同的目的。
1 - 请注意,这个问题无论如何都不会问这个!
推荐阅读
- centos - Openstack 实例 - 无可启动设备
- javascript - 在 ReactJS 中的 VisJS 网络图的画布上添加多个节点框选择器
- angular - 通过哪个 CLI 版本安装 Angular 5
- angular - Angular - 在组件之间共享数据,获取空数据
- python-3.x - ping 互联网以检查连接性
- java - Slf4j:找不到符号
- google-analytics - Google Analytics API 收入差异
- c++ - C++ - 我怎样才能找到向量
在向量中 > 有STL算法功能吗? - javascript - 无法从移动 Chrome 中的 blob url 读取音频
- apache-kafka - 识别具有消费数据的最旧 Kafka 偏移量