版权声明:所属版权归博主所有,最终解释权归博主 https://blog.csdn.net/qq_40267817/article/details/82184446
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Lock的使用方式
*/
public class LockUseCase {
/**
*在finally快中释放锁,目的使保证获取到锁后,最终能够被释放。
* 不要将获取锁的过程写在try中,由于在获取锁(自定义锁的实现)时发生了
* 异常抛出的同时,也会导致锁无故释放。
*
*/
public static void main(String[] args) {
Lock lock=new ReentrantLock();
lock.lock();
try{
//处理业务逻辑
}finally {
lock.unlock();
}
}
/*
Lock接口提供的synchronized关键字所不具备的主要特性
------------------------------------------------------------------------------------------------
特性 | 描述
------------------------------------------------------------------------------------------------
尝试非阻塞地获取锁 | 当前线程尝试获取锁,若这一时刻锁没有被其他线程获取到,则成功获取并持有锁
------------------------------------------------------------------------------------------------
能被中断地获取锁 | 与synchronized不同,获取到锁的线程能够响应中断,当获取到锁的线程被中断时
| 中断异常将会被抛出,同时锁会被释放
--------------------------------------------------------------------------------------------------
超时获取锁 | 在指定的截至时间之前获取锁,若截至时间到了仍旧无法获取锁,则返回
----------------------------------------------------------------------------------------------------
*/
/*
Lock是一个接口,它定义了锁获取和锁释放的基本操作
,其实现基本上通过聚合了一个同步器的子类来完成线程访问
控制的。
API如下
*/
//获取锁,调用该方法当前线程将会获取锁,当锁获得后,从该方法返回
public void lock() {}
//可中断地获取锁,和lock()方法的不同之处在于该方法会响应中断,即在
//锁的获取中可以中断当前线程
public void lockInterruptibly() throws InterruptedException {}
//尝试非阻塞的获取锁,调用该方法后立刻返回,若能获取则返回true,反之亦然。
public boolean tryLock() {
return false;
}
/*
超时的获取锁,当前线程在以下3种情况下会返回
1.当前线程在超时时间内获得了锁
2.当前线程在超时时间内被中断
3.超时时间结束,返回false
*/
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
return false;
}
//释放锁
public void unlock() { }
/*
获取等待通知组件,该组件和当前的锁绑定,当前线程只有获取了锁,才能调用该
组件的wait()方法,而调用后,当前线程将释放锁。
*/
public Condition newCondition() {
return null;
}
}