一、ReentrantLock获取锁的三种方式
1.lock():获取锁立即返回,别的线程持有锁,当前线程一直处于休眠状态,值到获取锁
2.tryLock():获取锁立即返回true,如果别的线程正持有锁,立即返回false;所以可以选择干别的操作
3.tryLock(long timeout,TimeUnit unit):获取锁立即返回true,如果别的线程持有锁,会等待参数给定的时间,在等待的过程中,如果获取锁定,返回true,如果等待超时,返回false
4.lockInteruptibly:获取锁立即返回,没有获取锁处于休眠状态,值到获取锁,或者当前线程被别的线程中断
二、Lock与sysnchronized区别
1.使用synchronized,如果A不释放,B将一直等待,不能被中断;ReentrantLock,如果A不释放,B在等待足够的时间,中断等待,选择干别的事
2.synchronized在JVM层面实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行出现异常,JVM会自动释放锁定,或者synchronized锁定的方法执行完,自动释放锁。而Lock是通过代码实现的,保证锁一定释放,必须执行unLock(),且放到finally{}
3.资源竞争不激烈的情况下,synchronized性能优于ReetantLock,但资源竞争激烈,synchronized性能会下降几十倍,但ReetrantLock性能能维持常态