lock源码的探究

lock的实现类是ReentrantLock。lock用的是Sync下面的lock锁。

public void lock() {
        sync.lock();
    }

sync里面有内部抽象类的公平和非公平的内部类

我们用的Lock默认的是非公平锁

public ReentrantLock() {
        sync = new NonfairSync();
    }

非公平锁的lock方法用的是cas比较并交换

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);
        }

compareAndSetState 是个CAS比较并交换的方法,如果是0,可以获得锁。

compareAndSetState的源码:

protected final boolean compareAndSetState(int expect, int update) {
        // See below for intrinsics setup to support this
        return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
    }

如果是1则进入else acquire

acquire的源码是这个

public final void acquire(int arg) {
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }

尝试获得锁失败同时显示的是等待标记,就终端该线程。

CAS的特点:

1、循环开销很大!

2、内存操作,每次只能保证一个共享变量的原子性!

3、出现ABA 问题?数据库中用version来解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
unique_lock 是 C++11 中新增的一种互斥量封装类,用于更方便地管理互斥量的加锁和解锁。它的源码实现在 <mutex> 头文件中。 unique_lock 是一个模板类,定义如下: ```c++ template<class Mutex> class unique_lock { public: // 构造函数 explicit unique_lock(Mutex& m); unique_lock(Mutex& m, defer_lock_t); unique_lock(Mutex& m, try_to_lock_t); unique_lock(Mutex& m, adopt_lock_t); template<class Clock, class Duration> unique_lock(Mutex& m, const chrono::time_point<Clock, Duration>& abs_time); template<class Rep, class Period> unique_lock(Mutex& m, const chrono::duration<Rep, Period>& rel_time); // 析构函数 ~unique_lock(); // 成员函数 void lock(); bool try_lock(); void unlock(); void swap(unique_lock& other) noexcept; bool owns_lock() const noexcept; explicit operator bool() const noexcept; // 禁止拷贝和赋值 unique_lock(const unique_lock&) = delete; unique_lock& operator=(const unique_lock&) = delete; // 友元函数 template<class Mutex2> friend class unique_lock; }; ``` unique_lock 有多个构造函数,用于不同的场景:默认构造函数会创建一个未关联互斥量的 unique_lock 对象;explicit unique_lock(Mutex& m) 构造函数会创建一个关联了互斥量 m 的 unique_lock 对象,并立即对互斥量进行加锁;unique_lock(Mutex& m, try_to_lock_t) 构造函数会尝试对互斥量 m 进行加锁,如果加锁失败则不会阻塞线程,而是立即返回 false;unique_lock(Mutex& m, adopt_lock_t) 构造函数会创建一个 unique_lock 对象,但是假设调用者已经对互斥量 m 进行加锁,因此 unique_lock 对象不会再对互斥量进行加锁,而是认为互斥量已经被加锁了;unique_lock(Mutex& m, const chrono::time_point<Clock, Duration>& abs_time) 和 unique_lock(Mutex& m, const chrono::duration<Rep, Period>& rel_time) 构造函数会尝试在指定的时间内对互斥量进行加锁。 unique_lock 的成员函数包括: - lock():对关联的互斥量进行加锁。 - try_lock():尝试对关联的互斥量进行加锁,如果加锁成功则返回 true,否则返回 false。 - unlock():对关联的互斥量进行解锁。 - swap(unique_lock& other):交换两个 unique_lock 对象的状态。 - owns_lock():返回当前 unique_lock 对象是否拥有互斥量的所有权。 - operator bool():返回当前 unique_lock 对象是否拥有互斥量的所有权。 此外,unique_lock 还有一个特殊的成员函数,用于将 unique_lock 对象转换为 lock_guard 对象: ```c++ template<class Mutex> std::lock_guard<Mutex> unique_lock<Mutex>::release() noexcept; ``` 该函数会将当前 unique_lock 对象所拥有的互斥量的所有权转移到一个新的 lock_guard 对象中,并将当前 unique_lock 对象重置为未关联任何互斥量的状态。 unique_lock 的实现方式与 lock_guard 类似,都是通过 RAII 技术来实现对互斥量的加锁和解锁。不同的是,unique_lock 提供了更加灵活的构造函数和成员函数,可以在更多的场景下使用。此外,unique_lock 还支持线程间传递所有权,这是 lock_guard 所不具备的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值