Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多级同步语句的用途是什么?_Java_Multithreading - Fatal编程技术网

Java 多级同步语句的用途是什么?

Java 多级同步语句的用途是什么?,java,multithreading,Java,Multithreading,我真的不明白多级同步语句的目的是什么?例如,在代码中: static void m() throws Exception { synchronized (sync) { System.err.println("First level synchronized"); synchronized (sync) { System.err.println("Second level synchronized"); sy

我真的不明白多级同步语句的目的是什么?例如,在代码中:

static void m() throws Exception {
    synchronized (sync) {
        System.err.println("First level synchronized");
        synchronized (sync) {
            System.err.println("Second level synchronized");
            synchronized (sync) {
                System.err.println("Third level synchronized");
            }
        }
    }
}

public static void main(String[] args) throws Exception {
    Runnable r = new Runnable() {
        @Override
        public void run() {
            try {
                m();
            } catch (Exception ex) {
                Logger.getLogger(IO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    };
    Thread th1 = new Thread(r);
    Thread th2 = new Thread(r);
    th1.run();
    th2.run();
}
如果某个线程已经开始执行最封闭的synchronized语句,则不可能为任何线程执行最封闭的synchronized语句。因此,我看不出这种结构有什么用处。你能提供一个例子来理解这种用法吗


嵌套同步语句的另一个示例可以在官方JLS规范中找到:

它是合法的示例,而不是有用或推荐的示例。这表明锁是递归的(“请注意,如果单个线程不允许多次锁定监视器,则该程序将死锁”)。

根据OP的评论,这来自

联合联络小组接着说:

请注意,如果不允许单个线程多次锁定监视器,则此程序将死锁

此示例旨在说明
同步的
块是可重入的

本JLS不是有用编码实践的文档


设计它是为了说明该语言应该如何工作。它记录了语言结构并定义了它们的行为——这是一个规范。

我也看不出有任何用处(当然,除非3个不同的对象被用作锁,而不是单个对象)。你在哪里见过这样的代码?你确定在同一个对象上同步的块吗?我不能提供这样的例子,因为这看起来很奇怪。@JBNizet这是对JLS第14.19.Ah节中的代码的一点修改,但JLS解释了使用这样的代码时会发生什么。它并没有说使用这样的代码是个好主意。也就是说,让同步方法调用其他同步方法是非常频繁的(因为被调用的方法也可以直接调用)。JLS解释了当一个线程在同一个对象上同步几次时会发生什么。
class Test {
    public static void main(String[] args) {
        Test t = new Test();
        synchronized(t) {
            synchronized(t) {
                System.out.println("made it!");
            }
        }
    }
}