我真的不明白多级同步语句的目的是什么?例如,在代码中:
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
答案 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;)。