java - 当同步方法正在执行时,非同步方法是否会阻塞

标签 java multithreading concurrency synchronized

在调用 plain() 方法之前,以下代码块在同步 sync() 方法中。为什么会这样,内在锁不应该只阻止对同步方法的调用——例如,如果 plain() 也被同步,这种行为就没问题了。

由于 java 使用的监视器概念仅适用于同步方法/ block ——根据定义,它不应影响非同步代码的执行。情况是否总是如此,或者此行为是否特定于 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...

最佳答案

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

关于java - 当同步方法正在执行时,非同步方法是否会阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12562893/

相关文章:

java - 使用java读取文本文件中一定数量的行

java - 错误 : org. hibernate.util.JDBCExceptionReporter - 无法加载 JDBC 驱动程序类 'com.mysql.jdbcDriver'

c - freeBSD中rqhead类的定义在哪里?

c# - 线程已退出,Windows 窗体中的代码为 0

python - 在Elasticsearch文档线程中更新数组是否安全?

concurrency - 动态调度和线程

java - 了解二叉搜索树计数

multithreading - 单体(对比)微服务 ==> 线程(对比)进程

javascript - 如何在没有冲突的 Node 中创建 tmp 目录

java - 仅当其他方法完成时才调用方法 - RxJava