美文网首页终端研发部Java学习笔记Java 杂谈
Java多线程编程核心技术(下)

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

作者: 凌云_00 | 来源:发表于2018-03-12 13:50 被阅读7次

    四 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为定时器

    六 单例模式与多线程

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

    相关文章

      网友评论

        本文标题:Java多线程编程核心技术(下)

        本文链接:https://www.haomeiwen.com/subject/frxpfftx.html