想象一下,你和你的朋友们想要进入一间房间,这间房间一次只能有一个人在里面。为了控制谁能进入这个房间,我们使用了一把锁。在这个比喻中,锁就是 ReentrantLock
。
情景1:基本的锁
假设你拿到了钥匙(调用 lock.lock()
),进入了房间。现在,如果另一个朋友也想进入房间,他们就必须等待你先出来并把钥匙放回(调用 lock.unlock()
)。一旦你出来并且释放了锁,下一个朋友就可以拿到钥匙进入房间。
Lock lock = new ReentrantLock();
public void enterRoom() {
lock.lock(); // 尝试获取钥匙进入房间
try {
// 在房间里做一些事情... 嘿嘿嘿...
} finally {
lock.unlock(); // 离开房间并把钥匙放回去
}
}
情景2:可重入性
现在,假设你是那个已经在房间里的人,并且你需要做更多的事情,比如检查房间里的每个角落。因为你是持有钥匙的人,所以你可以多次开门(再次调用 lock.lock()
)而不会被阻挡在外面。每当你完成一部分工作后,你就把钥匙插回锁里一次(调用 unlock()
)。只有当所有的 lock()
和 unlock()
成对出现时,其他人才有机会进入房间。
public void checkEveryCorner() {
lock.lock();
try {
// 检查第一个角落
lock.lock();
try {
// 检查第二个角落
} finally {
lock.unlock();
}
// 继续检查剩下的角落...
} finally {
lock.unlock();
}
}
情景3:公平性
想象一下,如果有好几个人都想进入这个房间,他们都在外面排队等着。如果你使用的是公平锁,那么他们会按照到达顺序依次进入。但是,如果你使用的是非公平锁,有时候后来的人可能会在队伍前面的人之前得到机会进入房间,因为他们碰巧在锁可用的时候尝试了。
// 创建一个公平锁
Lock fairLock = new ReentrantLock(true);
情景4:尝试获取锁
有时候,你可能不想一直等下去,而是想看看是否能立刻进入房间。如果你不能立刻进入,你也许会去做些别的事,稍后再回来试试。这就是 tryLock()
的作用——它尝试获取锁,但如果锁不可用,它会立即返回而不是等待。
if (lock.tryLock()) {
try {
// 进入房间并做事
} finally {
lock.unlock();
}
} else {
// 锁不可用,做些别的事
}
标签:ReentrantLock,lock,房间,finally,unlock,钥匙,进入
From: https://blog.csdn.net/hmbbpdx/article/details/144790932