我刚刚完成了一个操作系统课程,其中包括一个关于并发的大部分内容。现在我回到Java,我发现自己有一些关于Java同步系统的问题。大部分时间我都能抬起头来,但我抓不到了。
使用什么样的锁定机制来实现synchronized
块?我做了一个简单的测试,发现:
String s = "Asdf";
synchronized (s) {
synchronized (s) {
System.out.println("Got to inner block");
}
}
运行正确,所以我认为它不是一个简单的锁或单一许可信号量(在尝试连续两次获取它时会死锁)。
此外,在以下示例中:
public class Foo {
public synchronized void m() {
System.out.println("m called");
n();
}
public synchronized void n() {
System.out.println("n called");
//Do some other stuff...
}
}
public static void main(String[] args) {
Foo f1 = new Foo();
Thread t1 = new Thread(() -> f1.m());
Thread t2 = new Thread(() -> f1.m());
t1.start();
t2.start();
}
t1
(或t2
,无论哪个首先获得锁定,都会在m()
来电中保持foo锁定,或者是否放弃它然后尝试重新获取在m()
调用n()
时,假设m()
和n()
都是同步方法?我的猜测是前者,但在编写任何依赖于此假设的代码之前,我想确定。