java并发编程:ReentrantLock

153 阅读1分钟

ReentrantLock继承了Lock接口并实现了在接口定义的方法,是一个可重入的独占锁。ReentrantLock通过自定义队列同步器(Abstract Queued Sychronized,AQS)来实现锁的获取与释放。

独占锁指该锁在同一时刻只能被一个线程获取,而获取锁的其他线程只能在同步队列中等候;可重入锁指该锁能够支持一个线程对同一个资源执行多次加锁操作。

ReentrantLock 支持公平锁和非公平锁的实现。公平指线程竞争锁的机制是公平的,而非公平指不同的线程获取锁的机制是不公平的。

ReentrantLock不但提供了synchronized对锁的操作功能,还提供了诸如可响应锁中断锁、可轮训锁请求、定时锁等避免多线程死锁的方法。

1.ReentrantLock的用法

ReentrantLock有显式的操作过程,何时加锁、何时释放锁都在程序员的控制下。具体的使用流程是定义一个ReentrantLock,在需要加锁的地方通过Lock方法加锁,等资源使用完成后再通过unlock方法释放锁。具体的实现代码如下:


package com.java.study.concurrent;

import java.util.concurrent.locks.ReentrantLock;


public class ReentrantLockDemo implements Runnable{
    //step 1: 定义一个ReentrantLock

    public static ReentrantLock lock = new ReentrantLock();

    public static int i = 0;

    @Override
    public void run() {
           for (int j = 0; j<10 ; j++) {
               //step 2:加锁
               lock.lock();
               try {
                   i++;
               }finally {
                   lock.unlock();//释放锁
               }
           }
    }

    public static void main(String[] args) throws InterruptedException {
        ReentrantLockDemo reentrantLockDemo = new ReentrantLockDemo();
        Thread t1 = new Thread(reentrantLockDemo);
        t1.start();
        t1.join();
        System.out.println(i);
    }
}

ReentrantLock之所以被称为可重入锁,是因为ReentrantLock锁可以反复进入。即允许连续两次获得同一把锁,两次释放同一把锁。