0

考虑以下场景。

public synchronized String getData(){
    return getInfo();
}
private String getInfo(){                   
    // operation here should synchronized
    return  "Synchronize Info";
}

如果有人绕过这个操作的流程。系统可能会变得不稳定,如果 Java 编译器强制getInfo synchronized不存在此类问题。但是 Java 编译器并不强制这样做。现在开发人员应该负责制作getInfo synchronized与否。为什么 Java 不强制 make getInfo synchronized

4

2 回答 2

2

Java 编译器不可能有效地执行此操作。您可以发明一条规则,同步方法只能在同步的情况下调用同一对象的方法,但除非在非常狭窄的场景中,否则它没有帮助。如果getInfo()是公共的,则getData()可以轻松调用不同的类,该类会回调getInfo()原始对象。

此外,同步可以用于单个语句而不是整个方法,并且还有其他锁。试图设计编译器规则以防止在所有这些情况下使用非同步数据的同步代码将是复杂的或不可能的。

实际上,当知道只有线程在使用对象时,想要调用一个方法而不需要同步成本是合法的。决定对象的哪些部分应该被锁定以及何时锁定是一个复杂的设计问题,只有人类程序员才能做到。

因此,Java 不能/不会阻止您编写不安全的代码。它不在乎。如果“系统”是指“计算机”,它不会“变得不稳定”。在最坏的情况下,那一节课会出错。

于 2013-11-11T05:56:36.003 回答
1

http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html的 Java 文档中,“不可能对同一对象上的同步方法的两次调用交错”。

换句话说,如果您调用getData,那么将来getData对同一对象的任何调用都将等到该对象完成。所以即使控制流进入getInfo,系统仍然会阻塞任何未来的调用,getData直到第一个返回,所以没有理由getInfo应该阻塞。我希望这会有所帮助!

于 2013-11-11T05:18:17.923 回答