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

3
在调用 plain() 方法之前,以下代码块在同步的 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...");
    }
}

输出:

sleeping...
out...
plain...
1个回答

8

在新线程中应该调用start()而不是run()。调用run()会在当前线程中执行可运行对象的run方法,而不是启动一个新线程来运行它。


1
@haps10 这种情况发生在最好的人身上 :-) - maba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接