Java多线程编程(第四章)

1. ReentrantLock类

在Java多线程中,可以使用synchronized关键字来实现线程之间的同步互斥,在JDK1.5中增加了ReentrantLock类也可以实现同样的效果,并且功能更强。

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

  • 结合Condition对象,来实现等待/通知模式,具有更好的灵活性,比如可以实现多路通知功能,也就是一个Lock对象里面可以创建多个Condition(即对象监视器)实例,线程对象可以注册在指定的Condition中,从而可以有选择地进行线程通知(即控制部分线程行为)。在调用await方法,必须先获取锁(调用lock方法)

  • Object类的wait方法相当于Condition类中的await方法; Object类中的wait(long timeout)方法相当于Condition类中的await(long time, TimeUnit unit) 方法; Object类的notify方法相当于Condition类中的signal方法;Object的notifyAll方法相当于Condition类中的singalAll方法

  • 实现生产者/消费者模式:

    1. 一个生产者,一个消费者 用while 不用if
    2. 多个生产者,多个消费者 用while 不用if 解决假死情况, 用signalAll方法
  • 公平锁和非公平锁:
    公平锁表示线程获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得模式。而非公平锁就是获取锁的抢占机制,是随机获取锁的。

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

  • getQueueLength()方法
    返回正等待获取此锁定的线程个数

  • getWaitQueueLength(Condition condition)
    返回等待与此锁定相关的condition的线程数

  • hasQueueThread(Thread thread)方法
    查询指定的线程是否正在等待获取此锁定

  • hasQueueThreads()
    查询是否有线程正在等待获取此锁定

  • hasWaiters(Condition condition)
    查询是否有线程正在等待与此锁定有关的condition

  • isFair()
    判断是不是公平锁,默认的情况下是非公平锁

  • isHeldByCurrentThread()
    查询当前线程是否保持此锁定

  • isLocked()
    查询此锁定是否是被持有

  • lockInterruptibly()
    如果当前线程未被中断,则获取锁定;如果已经被中断,则抛出异常

  • tryLock()
    仅在调用时锁定未被另一个线程保持的情况下,才获取锁定

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

  • awaitUninterruptibly()
    await的是否,线程中断了,继续正常运行

  • awaitUntil(Date deadline)
    在等待时间已到,可以自动唤醒,并且在等待时间来临之间,可以被提前唤醒

  • 可以使用Condition来实现顺序打印,conditionA->conditionB->conditionC->conditionA循环

2. ReentrantReadWriteLock类

类ReentrantLock具有完全互斥排他的效果,即同一时间只有一个线程在执行ReentrantLock.lock()方法后面的任务。
读写锁表示有两个锁,一个是读相关的锁,也称为共享锁,另一个是写操作相关的锁,也称为互斥锁。读读不互斥,读写互斥,写写互斥。
- 读锁

ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
lock.readLock().lock();
//操作
lock.readLock().unlock();//在finally块中
  • 写锁
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
lock.writeLock().lock();
//操作
lock.writeLock().unlock();//在finally块中

你可能感兴趣的:(Java多线程编程(第四章))