Java多线程--Lock的使用

来源:互联网 发布:费玉清 爱情买卖知乎 编辑:程序博客网 时间:2024/05/03 15:23

使用ReentrantLock类

Lock和synchronized机制的主要区别:

1 synchronized机制提供了对与每个对象相关的隐式监视器锁的访问, 并强制所有锁获取和释放均要出现在一个块结构中, 当获取了多个锁时, 它们必须以相反的顺序释放. synchronized机制对锁的释放是隐式的, 只要线程运行的代码超出了synchronized语句块范围, 锁就会被释放.

2 Lock机制必须显式的调用Lock对象的unlock()方法才能释放锁, 这为获取锁和释放锁不出现在同一个块结构中,以及以更自由的顺序释放锁提供了可能.

1 公平锁与非公平锁

  • 公平锁:表示线程获取锁的顺序是按照线程加锁的顺序来分配的,即先进先出的顺序
  • 非公平锁:一种获取锁的抢占机制,是随机获得锁的
// 通过参数设定锁是否为公平锁/** * Creates an instance of {@code ReentrantLock} with the * given fairness policy. * * @param fair {@code true} if this lock should use a fair ordering policy */public ReentrantLock(boolean fair) {    sync = fair ? new FairSync() : new NonfairSync();}

2 方法getHoldCount()、getQueueLength()和getWaitQueueLength(Condition condition)的使用

  • getHoldCount():查询当前线程保持此锁定的个数,也就是调用lock()方法的次数
  • getQueueLength():返回正等待此锁定的线程估计数
  • 个体WaitQueueLength():返回等待与此锁定相关的给定条件Condition的估计数

3 方法hasQueueThread()、hasQueueThreads()和hasWaiters()的使用

  • hasQueueThread(Thread thread):查询指定线程是否正在等待获取此线程
  • hasQueueThreads():查询是否有线程正在等待获取此线程
  • hasWaiters(Condition condition):查询是否有线程正在等待以此锁定有关的condition条件

4 方法isFair()、isHeldByCurrentThread()和isLocked()的使用

  • isFair():判断是否是公平锁 (默认情况下,ReentrantLock是非公平锁)
  • isHeldByCurrentThread():查询当前线程是否保持此锁定
  • isLocked():查询此锁定是否由任意线程保持

5 方法lockInterruptibly()、tryLock()和tryLock(long timeout, TimeUnit unit)的使用

  • lockInterruptibly():如果当前线程未被中断,则获取锁;如果已经锁定则抛出异常
  • tryLock():查询当前线程是否保持此锁定
  • isLocked():查询此锁定是否由任意线程保持

使用ReentrantReadWriteLock

读写锁表示也有两个锁:一个读操作相关的锁,也称为共享锁;另一个写操作相关的锁,也称为排它锁。

多个读锁之间不互斥,读锁与写锁互斥,写锁与写锁互斥

  • 读读共享
  • 写写互斥
  • 读写互斥
  • 写读互斥
0 0
原创粉丝点击