ReentrantLock
Java 1.5并发API提出了带有Lock接口和一些实现类的java.util.concurrent.locks包来改进Object锁定机制。Java Lock API中的一些重要的接口和类有:
- Lock:这是Lock API的基本接口。它提供了synchronized关键字的所有功能,以及创建不同的锁定条件的其他方法,为线程等待锁定提供超时。
- Condition:Condition 对象类似于具有附加功能的对象wait-notify模型,以创建不同的等待集。Condition对象总是由Lock对象创建。
- ReadWriteLock:它包含一对关联的锁,一个用于只读操作,另一个用于写入。只要没有写线程,读锁可以由多个读线程同时保持。写锁定是独占的。
- 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 。
浙公网安备 33010602011771号