Java之显示锁

本文介绍了Java 1.5引入的显示锁ReentrantLock,它提供了比内置锁更高级的功能,如无条件、可轮询、定时和可中断的锁获取操作。文章详细讲解了Lock接口和ReentrantLock类,以及公平锁与非公平锁的概念。此外,还讨论了轮询锁、定时锁、可中断锁的获取方式,以及读写锁的使用,强调在适当情况下使用ReentrantLock以提高并发性能。
摘要由CSDN通过智能技术生成

 在Java 1.5之前,协调对共享对象的访问可以使用的机制只有synchronizedvolatile两种。Java1.5增加了一种新的机制:ReentrantLock。但ReentrantLock并不是替代内置加锁的方法,而是当内置加锁机制不适用时,作为一种可选择的高级功能。

1、Lock与ReentrantLock

lock是一个接口,定义了一组抽象的加锁操作。与synchronized不同的是,lock提供了一种无条件的、可轮询的、定时的以及可中断的锁的获取操作,下面来看lock接口的源码、

public interface Lock {
   

    //获得锁,如果锁定不可用,则当前线程将被禁用以进行线程调度,并且在此之前处于休眠状态。
    void lock();

    //如果当前线程未被中断,则获取锁。如果锁可用,则获取锁,并立即返回。可中断锁获取操作的实现
    void lockInterruptibly() throws InterruptedException;

    //仅在调用时锁为空闲状态才获取该锁。通常对于那些不是必须获取锁的操作可能有用。轮询锁及可定时锁获取操作的实现。
    boolean tryLock();

    //若锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。轮询锁及可定时锁获取操作的实现。
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

    //释放锁。对应于lock()、tryLock()、tryLock(xx)、lockInterruptibly()等操作,如果成功的话应该对应着一个unlock(),这样可以避免死锁或者资源浪费。
    void unlock();

    //返回绑定到此 Lock 实例的新 Condition 实例。
    Condition newCondition();
}

ReentrantLock实现了lock接口,它提供了与synchronized相同的互斥性、内存可见性及可重入的加锁语义,在加锁与释放锁时也与synchronized有相同的内存语义。下面来看ReentrantLock的实现。

public class ReentrantLock implements Lock, java.io.Serializable {
   
    private static final long serialVersionUID = 7373984872572414699L;
    /** Synchronizer providing all implementation mechanics */
    private final Sync sync;

    //基于AQS实现的同步机制
    abstract static class Sync extends AbstractQueuedSynchronizer {
   
        ...
    }

    //非公平锁的实现,默认是非公平锁
    static final class NonfairSync extends Sync {
   
        private static final long serialVersionUID = 7316153563782823691L;

        /**
         * Performs lock.  Try immediate barge, backing up to normal
         * acquire on failure.
         */
        final void lock() {
   
            if (compareAndSetState(0, 1))
                setExclusiveOwnerThread(Thread.currentThread());
            else
                acquire(1);
        }

        protected final boolean tryAcquire(int acquires) {
   
            return nonfairTryAcquire(acquires);
        }
    }

    //公平锁的实现
    static final class FairSync extends Sync {
   
        private static final long serialVersionUID = -3000897897090466540L;

        final void lock() {
   
            acquire(1);
        }

        /**
         * Fair version of tryAcquire.  Don't grant access unless
         * recursive call or no waiters or is first.
         */
        protected final boolean tryAcquire(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值