多级同步语句的目的是什么?

时间:2014-08-30 15:18:01

标签: java multithreading

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

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语句。所以,我看不出这种结构有用。你能提供一个例子来理解这样的使用吗?

嵌套同步语句的另一个例子可以在官方JLS规范中找到:http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.19

2 个答案:

答案 0 :(得分:7)

根据OP的评论,这来自JLS §14.19

class Test {
    public static void main(String[] args) {
        Test t = new Test();
        synchronized(t) {
            synchronized(t) {
                System.out.println("made it!");
            }
        }
    }
}

JLS接着说:

  

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

这个示例旨在说明synchronized块是可重入的。

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

它旨在说明语言应该如何运作。它记录语言结构并定义它们的行为 - 它是规范

答案 1 :(得分:2)

这是一个合法的例子,而不是有用或推荐的东西。它显示锁是递归的("注意,如果不允许单个线程多次锁定监视器,该程序将会死锁#34;)。