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...
4

1 回答 1

8

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

于 2012-09-24T10:13:32.163 回答