锁内存语义的实现

  本文将借助ReentrantLock的源代码,来分析锁内存语义的具体实现机制。

  请看下面的示例代码:

class ReentrantLockExample {
int a = 0;
ReentrantLock lock = new ReentrantLock();

public void writer() {
    lock.lock();         //获取锁
    try {
        a++;
    } finally {
        lock.unlock();  //释放锁
    }
}

public void reader () {
    lock.lock();        //获取锁
    try {
        int i = a;
        ……
    } finally {
        lock.unlock();  //释放锁
    }
}
}

  在ReentrantLock中,调用lock()方法获取锁;调用unlock()方法释放锁。

  ReentrantLock的实现依赖于java同步器框架AbstractQueuedSynchronizer(本文简称之为AQS)。AQS使用一个整型的volatile变量(命名为state)来维护同步状态,马上我们会看到,这个volatile变量是ReentrantLock内存语义实现的关键。下面是ReentrantLock的类图(仅画出与本文相关的部分):

  ReentrantLock分为公平锁和非公平锁,我们首先分析公平锁。

  使用公平锁时,加锁方法lock()的方法调用轨迹如下:

  1、ReentrantLock:lock()

  2、FairSync:lock()

  3、AbstractQueuedSynchronizer:acquire(int arg)

  4、ReentrantLock:tryAcquire(int acquires)