假设当前线程持有锁,那么同一个线程调用
synchronize(lock)
再次,会发生死锁吗?
依稀记得同一个线程的锁是可重入的,这是什么意思?
从文档:
线程无法获得另一个线程拥有的锁。但是线程可以获取它已经拥有的锁。允许一个线程多次获取同一个锁可以实现重入同步。这描述了一种情况,同步代码直接或间接调用一个也包含同步代码的方法,并且两组代码都使用相同的锁。
你没记错,可重入意味着同一个线程可以多次获得同一个锁,例如:
private final Object lock = new Object();
public void foo() {
synchronized(lock) {
bar();
}
}
public void bar() {
synchronized(lock) {
//...
}
}
按预期工作,以及(这里this
用作隐式锁定对象):
public synchronized void foo() {
bar();
}
public synchronized void bar() {
//...
}
并且不会发生死锁。当然,其他线程既不能访问也foo()
不能bar()
同时访问,因为锁已经被占用了。
底线:锁是由线程获取的,而不是由方法/代码块获取的。并且获取已由同一线程获得的锁是无操作的。
每个object
人都有一个lock and a key
保护自己的crucial data state
人,every Class has a lock and a key
保护自己的人也一样crucial static data state.
synchronized keyword on the atomic statements
(方法或原子化语句)
就像锁定对象一样。当线程访问该方法或原子语句时,它必须获得key for that object
.
Once it obtains the key,
its free to access this synchronized method/statement
or any other synchronized method/statement of that object.
Thats what reentrant is all about.
但是没有其他线程能够访问这个对象的同步块,直到当前持有密钥的线程放开密钥。