【发布时间】:2018-11-14 13:24:44
【问题描述】:
在这个简单的例子中,我有两个 synchronized (theLock) 被不同的线程访问
public class Main {
public static void main(String[] args) throws InterruptedException {
System.out.println("start");
final Object theLock = new Object();
synchronized (theLock) {
System.out.println("main thread id : " + Thread.currentThread().getId());
new Thread(() -> {
System.out.println("new thread id : " + Thread.currentThread().getId() + ". Inside thread");
// before entering this section new thread should be blocked as `theLock` is already acquired
synchronized (theLock) {
System.out.println("inside synchronized");
theLock.notify();
}
}).start();
theLock.wait();
}
System.out.println("end");
}
}
为什么新创建的线程可以访问synchronized (theLock)里面的部分?据我了解,theLock 已经被主线程获取,新的应该永远阻塞。相反,我看到它也进入了synchronized。
这是一个输出
start
main thread id : 1
new thread id : 13. Inside thread
inside synchronized
end
【问题讨论】:
-
原始线程调用
theLock.wait(),这意味着它释放锁并等待通知。然后第二个线程获取锁,调用notify,释放锁。然后第一个线程被唤醒,获得锁,然后继续。
标签: java multithreading synchronized synchronized-block