使用ReentrantLock

    我们知道Java语言直接提供了synchronized关键字用于加锁,但这种锁一是很重,二是获取时必须一直等待,没有额外的尝试机制。

    java.util.concurrent.locks包提供的ReentrantLock用于替代synchronized加锁,我们来看一下传统的synchronized代码:

    如果用ReentrantLock替代,可以把代码改造为:

    顾名思义,ReentrantLock是可重入锁,它和synchronized一样,一个线程可以多次获取同一个锁。

    synchronized不同的是,ReentrantLock可以尝试获取锁:

    上述代码在尝试获取锁的时候,最多等待1秒。如果1秒后仍未获取到锁,tryLock()返回false,程序就可以做一些额外处理,而不是无限等待下去。

    ReentrantLock可以替代synchronized进行同步;

    ReentrantLock获取锁更安全;

    必须先获取到锁,再进入try {…}代码块,最后使用finally保证释放锁;

    读后有收获可以支付宝请作者喝咖啡,读后有疑问请加微信群讨论

    使用ReentrantLock - 图1