假设我有一个CustomThread
的2个实例和一个名为printer
的公共对象实例。在print
的{{1}}方法内部,如果我最后做printer
和lock.lock()
,这是如何工作的?
lock.unlock()
我将从2个线程对象中调用此方法。
我的问题是,方法private class Printer{
private final Lock mutex = new ReentrantLock(true);
public void print(int thread){
try {
mutex.lock();
for(int i = 0; i < 10; ++i) {
System.out.println(String.format("Printing: %d for Thread: %d", i, thread));
}
} catch(Exception e){
} finally {
mutex.unlock();
}
}
}
本身如何?锁不是基于线程的吗?也许我在这里混淆了核心思想。当我在方法内部进行锁定时,这是什么意思?
答案 0 :(得分:4)
您可以将其视为锁具有一个名为owner
的字段,该字段为Thread
。
当调用lock()
且owner
为null
时,owner
被分配给调用线程。调用unlock()
时,owner
被重设为null
。
当调用lock()
且owner
不是null
时(不是当前线程,因为锁是可重入的),则调用线程将阻塞直到另一个线程放弃所有权为止并可以将其分配为新所有者。
另一个复杂之处在于,必须将当前线程的检查以及当前线程作为新所有者的条件分配都视为由其他线程自动进行。这样可以保留锁的完整性。