假设当前线程持有锁,然后同一线程调用
synchronize(lock)
再次,会发生僵局吗?
我依稀记得锁是同一个线程的重入,这是什么意思?
答案 0 :(得分:8)
线程无法获取另一个帖子所拥有的锁定。 但是 线程可以获取它已拥有的锁。允许线程到 不止一次获得相同的锁可以重入 同步。这描述了同步代码的情况, 直接或间接调用也包含的方法 同步代码,两组代码都使用相同的锁。
答案 1 :(得分:7)
你没记错,可重入意味着同一个线程可以多次获得相同的锁,例如:
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()
,因为已经锁定了。
底线:锁是由线程而不是方法/代码块来进行的。获取同一个线程已经获得的锁是一个无操作。
答案 2 :(得分:0)
每个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.
但是没有其他线程能够访问此对象的同步块直到当前密钥保持线程,放开密钥。