Java中的锁如何工作?

时间:2018-08-16 22:39:50

标签: java multithreading locking

假设我有一个CustomThread的2个实例和一个名为printer的公共对象实例。在print的{​​{1}}方法内部,如果我最后做printerlock.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(); } } } 本身如何?锁不是基于线程的吗?也许我在这里混淆了核心思想。当我在方法内部进行锁定时,这是什么意思?

1 个答案:

答案 0 :(得分:4)

您可以将其视为锁具有一个名为owner的字段,该字段为Thread

当调用lock()ownernull时,owner被分配给调用线程。调用unlock()时,owner被重设为null

当调用lock()owner不是null时(不是当前线程,因为锁是可重入的),则调用线程将阻塞直到另一个线程放弃所有权为止并可以将其分配为新所有者。

另一个复杂之处在于,必须将当前线程的检查以及当前线程作为新所有者的条件分配都视为由其他线程自动进行。这样可以保留锁的完整性。