假设我有 2 个 a 实例CustomThread和一个名为printer. 在 的print方法内部printer,如果我在最后执行 alock.lock()和lock.unlock(),这是如何工作的?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(); } } }我将从我的 2 个线程对象中调用此方法。我的问题是,方法lock本身如何?锁不是基于线程的吗?也许我在这里混淆了核心思想。当我在方法中加锁时,这意味着什么?
1 回答
翻翻过去那场雪
TA贡献2065条经验 获得超14个赞
你可以把它想象成一个锁有一个叫做 的字段owner
,它是一个Thread
.
当lock()
被调用,并且owner
是null
,owner
被分配到调用线程。当unlock()
被调用时,owner
被重置为null
。
当lock()
被调用并且owner
不是null
(并且不是当前线程,因为锁是可重入的)时,调用线程会阻塞,直到另一个线程放弃所有权并且可以将其分配为新的所有者。
额外的复杂性是检查当前所有权以及将当前线程有条件地分配为新所有者,这两者都必须被其他线程原子地看到。这保留了锁的完整性。
添加回答
举报
0/150
提交
取消