我真的不明白多级同步语句的目的是什么?例如,在代码中:
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();
}
如果某个线程已经开始执行一个同步语句,则不可能对任何线程执行最封闭的同步语句。因此,我看不到这种构造的任何用处。您能提供一个例子来理解这种用法吗?
嵌套的同步语句的另一个示例可以在官方JLS规范中找到:http : //docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.19
根据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不是有用的编码实践的文档。
它旨在说明该语言应如何工作。它记录了语言构造并定义了它们的行为-这是一个规范。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句