同步块底层实现

时间:2015-12-23 06:16:08

标签: java multithreading synchronization

我刚刚完成了一个操作系统课程,其中包括一个关于并发的大部分内容。现在我回到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()都是同步方法?我的猜测是前者,但在编写任何依赖于此假设的代码之前,我想确定。

0 个答案:

没有答案
相关问题