在调用 plain() 方法之前,以下代码块在同步的 sync() 方法中。为什么这样做呢?难道内置锁不应该只阻止对同步方法的调用吗?例如,如果 plain() 也是同步的,那么这种行为就可以接受。
由于 Java 使用的监视器概念仅适用于同步方法/块,因此按定义它不应影响非同步代码的执行。这种情况总是如此,还是这种行为取决于 JVM 实现呢?
由于 Java 使用的监视器概念仅适用于同步方法/块,因此按定义它不应影响非同步代码的执行。这种情况总是如此,还是这种行为取决于 JVM 实现呢?
public class Main {
public static void main(final String[] args) {
final Main main = new Main();
new Thread(new Runnable() {
@Override
public void run() {
main.sync();
}
}).run();
main.plain();
}
public synchronized void sync() {
try {
System.out.println("sleeping...");
Thread.sleep(2000);
System.out.println("out...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void plain() {
System.out.println("plain...");
}
}
输出:
sleeping...
out...
plain...