ReentrantLock

Java 1.5并发API提出了带有Lock接口和一些实现类的java.util.concurrent.locks包来改进Object锁定机制。Java Lock API中的一些重要的接口和类有:

  1. Lock:这是Lock API的基本接口。它提供了synchronized关键字的所有功能,以及创建不同的锁定条件的其他方法,为线程等待锁定提供超时。
  2. Condition:Condition 对象类似于具有附加功能的对象wait-notify模型,以创建不同的等待集。Condition对象总是由Lock对象创建。
  3. ReadWriteLock:它包含一对关联的锁,一个用于只读操作,另一个用于写入。只要没有写线程,读锁可以由多个读线程同时保持。写锁定是独占的。
  4. ReentrantLock:这是Lock接口中使用最广泛的实现类。除了Lock接口实现,ReentrantLock包含一些实用程序方法来获取线程持有锁,线程等待获取锁等。
public class ConcurrencyLockExample implements Runnable{

    private Resource resource;
    private Lock lock;
    
    public ConcurrencyLockExample(Resource r){
        this.resource = r;
        this.lock = new ReentrantLock();
    }
    
    @Override
    public void run() {
        try {
            if(lock.tryLock(10, TimeUnit.SECONDS)){
            resource.doSomething();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            //release lock
            lock.unlock();
        }
        resource.doLogging();
    }

}

Java Lock vs synchronized

  • Java Lock API为锁定提供了更多的可见性和选项,与synchronized不同,线程可能会无限期地等待锁定,我们可以使用tryLock()来确保线程仅等待特定时间。
  • Synchronization 代码更干净,易于维护,而Lock 我们被迫try-finally块,以确保锁释放,即使在lock()和unlock()方法调用之间抛出一些异常。
  • synchronization 块或方法只能覆盖一个方法,而我们可以在一个方法中获取锁并使用Lock API在另一个方法中释放它。
  • synchronized关键字不提供公平性,而我们可以在创建ReentrantLock对象时将公平性设置为true,以便最长等待线程首先获得锁定。
  • 我们可以为Lock创建不同的conditions ,不同的线程可以await()不同的conditions 。

posted on 2016-11-24 16:30  我叫涛哥  阅读(67)  评论(0)    收藏  举报

导航