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!");
}
}
}
}