非同步方法在执行同步方法时会阻塞

hap*_*s10 3 java concurrency multithreading synchronized

在调用plain()方法之前,以下代码在synchronized sync()方法中阻塞.为什么会这样,本地锁块不应该只调用同步方法 - 例如,如果plain()同步,这种行为也没问题.

由于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...");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

sleeping...
out...
plain...
Run Code Online (Sandbox Code Playgroud)

Ian*_*rts 8

你应该打电话start()而不是run()新线程.调用run()run在当前线程中执行runnable的方法,而不是启动新线程来运行它.