ReentrantLock

想象一下,你和你的朋友们想要进入一间房间,这间房间一次只能有一个人在里面。为了控制谁能进入这个房间,我们使用了一把锁。在这个比喻中,锁就是 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 {
    // 锁不可用,做些别的事
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值