Lock的使用

在Java多线程中,可以使用synchronized关键字来实现线程之间同步互斥,但在JDk 1.5中新增加了ReentrantLock类也能达到同样的效果,并且在扩展功能上也更加强大,比如具有嗅探锁定,多路分支通知等功能,而且在使用上也比synchronized更加的灵活。

调用ReentrantLock 对象的lock()方法获取锁,调用unlock()方法释放锁。

类ReentrantLock 使用Condition实现等待/通知,可以实现多路通知功能,也就是在一个Lock对象里面可以创建多个Condition(即对象监视器)实例,线程对象可以注册在指定的Condition中,从而可以有选择性的进行线程通知,在调度线程上更加灵活。

Lock的使用_第1张图片

 公平锁与非公平锁:锁Lock分为“公平锁” 和 “非公平锁” ,公平锁表示线程获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得的FIFO先进先出顺序,而非公平锁就是一种获取锁的抢占机制,是随机获得锁的,和公平锁不一样的就是先来的不一定先得到锁,这个方式可能造成某些线程一直拿不到锁,结果也就是不公平的了。

方法int getHoldCount() 的作用是查询当前线程保持此锁定的个数,也就是调用lock()方法的次数。

方法int getQueueLength()的作用是返回正等待获取此锁定的线程估计数。比如有5个线程,1个线程首先执行await()方法,那么在调用该方法后返回值是4,说明有4个线程同时在等待lock的释放。

方法int getWaitQueueLength(Condition condition)的作用是返回等待与此锁定相关的给定条件Condition的线程估计数,比如有4个线程,每个线程都执行了同一个condition对象的await()方法,则调用该方法时返回的int值是5。、

方法boolean  hasQueuedThread(Thread thread)的作用是查询指定的线程是否正在等待获取此锁定。

方法boolean  hasQueuedThreads()的作用是查询是否有线程正在等待获取此锁定。

方法boolean hasWaiters(Condition condition)的作用是查询是否有线程正在等待与此锁定有关的condition条件。

方法boolean isFair()判断是不是公平锁。

方法boolean isHeldByCurrentThread()查询当前线程是否保持此锁定。

方法boolean isLocked 查询此锁定是否由任意线程保持。

方法void lockInterruptibly()如果当前线程未被中断,则获取锁定,如果已经被中断则出现异常。

方法boolean tryLock()的作用是,仅在调用时锁定未被另一个线程保持的情况下,才获取该锁定。

方法boolean tryLock(long timeout ,TimeUnit unit)的作用是,如果锁定在给定等待时间内没有被另一个线程保持,且当前线程未被中断,则获取该锁定。

你可能感兴趣的:(Java,thread)