Java多线程编程核心技术(下)

四 Lock的使用

  在原著本章节,作者详细讲述了两种Lock,并叙述了Lock相对synchronized关键字的优点,但是在我看来,Lock是对synchronized关键字应用场景的一个补充,二者都有相对独立的应用场景,在相对要求简单的多线程并发场景下synchronized关键字肯定是最方便简单的,而在复杂的多线程多同步的场景中,Lock锁能实现的功能synchronized是做不到的。

- ReentrantLock类

  1. 使用ReentrantLock类
private Lock lock = new ReentrantLock();
public void testMethos(){
          lock.lock();
             //同步代码
           lock.unlock();
}
  1. 使用Condition 实现等待/通知
private Lock lock = new ReentrantLock();
public Condition condition = lock.newCondition();
public void testMethos(){
          lock.lock();
             //同步代码
            condition.await();
            // 同步代码
           lock.unlock();
}


public void signal(){
          lock.lock();
             //同步代码
            condition.signal();
            // 同步代码
           lock.unlock();
}
  1. 使用Condition 实现多路等待/通知
    利用多个Condition 对象实现多路的等待/通知-自己看书吧。。。。
  2. 公平锁与非公平锁
  • 公平锁 表示线程获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得的FIFO先进先出顺序
private Lock lock = new ReentrantLock(true);
  • 非公平锁 随机获取锁(默认)
  1. ReentrantLock相关方法
- getHoldCount() 查询当前线程保持此锁的个数,也就是调用lock()方法的次数
 - getQueueLength() 返回正等待获取此锁的线程估计数 如果返回4 ,说明有4个线程同时在等待lock的释放
 - getWaitQueueLength(Condition condition)返回等待给定条件Condition的线程估计数
- hasQueuedThread(Thread thread) 查询指定线程是否正在等待获取此锁定
- hasQueuedThread() 查询是否有线程正在等待获取此锁定
- hasWaiters(Condition condition) 查询是否有线程正在等待与此锁定有关的condition条件
- isFair() 判断是不是公平锁
- IsHeldByCurrentThread() 查询当前线程是持有此锁
- isLocked() 查询此锁是否有线程持有
- lockInterruptibly() 如果当前线程未被中断,则获取锁定
- tryLock() 在调用时,如果当前锁未被持有,则获取锁定
- tryLock(long timeout,TimeUnit unit) 如果在给定的时间内锁没有被其他线程持有,且当前线程未被中断,则获取锁定
- awaitUninterrupTibly()
- awaitUntil() 

- ReentrantReadWriteLock类

  类ReentrantLock具有完全互斥排他的效果,即同一时间只有一个线程在执行ReentrantLock.lock()方法后面的任务,这样做,虽然保证了实例变量的线程安全,但效率是非常低下的。所以JDK提供了 一种读写锁ReentranRead
WriteLock类,使用它可以加快运行效率

- 读写锁表示也有两个锁

          1. 一个读操作相关的锁,也称为共享锁,多个读锁之间不互斥
          2. 一个写操作相关的锁,也叫排它锁,读锁与写锁互斥,写锁与写锁互斥

- 读写锁使用方法


ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

//读锁
lock.readLock().lock();

//写锁
lock.writeLock().lock();

五 定时器

  定时器章节的内容已经过时,现在有更好的定时框架Quartz,所以不做讲述,推荐使用Quartz为定时器

六 单例模式与多线程

  此章节非常重要,通过单例模式和多线程技术的结合使用,来讲述所线程使用过程的坑和解决方案,提供真实的多线程使用环境和问题,开阔读者思路,因本章代码多,难度大 就不在此表述,大家可以自行看书学习

推荐阅读更多精彩内容