不应该';Java编译器强制执行同步吗?

不应该';Java编译器强制执行同步吗?,java,synchronized,Java,Synchronized,考虑以下场景 public synchronized String getData(){ return getInfo(); } private String getInfo(){ // operation here should synchronized return "Synchronize Info"; } 如果有人通过了这个操作流程。如果Java编译器强制使getInfosynchronized同步,那么系统可能会变得不稳

考虑以下场景

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

如果有人通过了这个操作流程。如果Java编译器强制使
getInfo
synchronized
同步,那么系统可能会变得不稳定。但Java编译器并不强制这样做。现在开发人员应该负责使
getInfo
同步化
。为什么Java不强制使
getInfo
synchronized

来自Java文档中的“不可能在同一对象上交替调用两个同步方法”


换句话说,如果调用
getData
,那么以后对同一对象调用
getData
都将等待该调用完成。因此,即使控制流移动到
getInfo
,系统仍将阻止以后对
getData
的任何调用,直到第一个调用返回,因此没有理由阻止
getInfo
。我希望这有帮助

来自Java文档中的“不可能在同一对象上交替调用两个同步方法”


换句话说,如果调用
getData
,那么以后对同一对象调用
getData
都将等待该调用完成。因此,即使控制流移动到
getInfo
,系统仍将阻止以后对
getData
的任何调用,直到第一个调用返回,因此没有理由阻止
getInfo
。我希望这有帮助

来自Java文档中的“不可能在同一对象上交替调用两个同步方法”


换句话说,如果调用
getData
,那么以后对同一对象调用
getData
都将等待该调用完成。因此,即使控制流移动到
getInfo
,系统仍将阻止以后对
getData
的任何调用,直到第一个调用返回,因此没有理由阻止
getInfo
。我希望这有帮助

来自Java文档中的“不可能在同一对象上交替调用两个同步方法”


换句话说,如果调用
getData
,那么以后对同一对象调用
getData
都将等待该调用完成。因此,即使控制流移动到
getInfo
,系统仍将阻止以后对
getData
的任何调用,直到第一个调用返回,因此没有理由阻止
getInfo
。我希望这有帮助

Java编译器不可能有效地实施这一点。您可以发明一条规则,即同步的方法只能在同步的情况下调用同一对象的方法,但除了在非常狭窄的场景中,这是没有帮助的。如果
getInfo()

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

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


所以Java不能/不会阻止您编写不安全的代码。它不在乎。如果你所说的“系统”是指“计算机”,它就不会“变得不稳定”。在最坏的情况下,这一类将是有缺陷的。

Java编译器不可能有效地实施这一点。您可以发明一条规则,即同步的方法只能在同步的情况下调用同一对象的方法,但除了在非常狭窄的场景中,这是没有帮助的。如果
getInfo()

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

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


所以Java不能/不会阻止您编写不安全的代码。它不在乎。如果你所说的“系统”是指“计算机”,它就不会“变得不稳定”。在最坏的情况下,这一类将是有缺陷的。

Java编译器不可能有效地实施这一点。您可以发明一条规则,即同步的方法只能在同步的情况下调用同一对象的方法,但除了在非常狭窄的场景中,这是没有帮助的。如果
getInfo()

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

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

所以Java不能/不会阻止您编写非theads的代码