假设我有以下代码:
synchronize (Test.class) {
...
}
- 这是否意味着
Test.class
对象被锁定 在同一个虚拟机中运行的其他程序?或者这样做 锁只影响 JVM 中的这一个程序? - 如果它影响每个程序:当
Test.class
处于两个程序通过不同但内容相同的 JAR 包含的依赖项中时,锁是否仍会影响两个程序?
最佳答案
当您有多个类加载器时,每个类加载器都可以拥有自己的类实例(或共享类实例),例如String.class
将被共享,但 MyType.class
在每个“应用程序”中可能不同,假设每个应用程序都有自己的类加载器。
在锁定方面,Class
对象除了在static synchronised
方法中隐式使用外,并没有什么特别之处。
例如
class MyType {
static synchronized void method() { }
}
与
非常相似class MyType {
static void method() {
synchronized(MyType.class) {
}
}
}
它执行相同的功能,尽管字节码不相同。
关于java - JVM 中 .class 对象的同步范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28659350/