【Java多线程】编程核心技术4Lock

【Java多线程】编程核心技术4Lock

 

Lock

     ReentrantLock:

            线程间同步互斥,且嗅探锁定、多路分支通知,使用上较synchronized灵活

            调用该对象的lock()获取锁,unlock()释放锁

            借助Condition实现等待/通知模式:Condition(对象监视器)是JDK5、灵活性

                   多路通知:一个Lock对象中建多个Condition实例,线程对象可以注册在指定的Condition中,有选择地线程通知,调度线性更灵活;

                 而synchronized相当于整个Lock只有单一的Condition对象,all的线程都注册在他身上,线程开始notifyAll时,需要通知所有的waiting线程,无选择权、效率问题

 
  1. private ReentrantLock lock=new ReentrantLock();

  2. private Condition condition = lock.newCondition();

  3. public void test1(){

  4. try {

  5. lock.lock();//在await调用前调用,获取同步监视器

  6. System.out.println("刷存在感的来辣~666");

  7. condition.await();

  8. } catch (InterruptedException e) {

  9. e.printStackTrace();

  10. }

  11. }

Object中的wait、wait(long timeout)、notify、notifyAll分别相当于Condition类中的await、await(long time ,TimeUnit unit)、signal、signalAll方法,但是这个signalAll也不全是all:唤醒在Lock对象上等待的所有线程。

 

公平锁与非公平锁:

      创建实例时的true、false

      公平锁:线程获取锁的顺序是按照线程加锁的顺序来分配的,先来先得FIFO

      非公平锁:获取锁的抢占机制,随机获得锁

      

 

lock部分方法:

      1、getHoldCount查询当前线程保持此锁定的个数,调用lock的次数

       2、getQueueLength返回等待获取此锁定的线程的估计数

       3、getWaitQueueLength(Condition condition)返回 等待 与 此锁定相关的给定条件的 线程估计数

       4、boolean hasQueuedThread(Thread thread)查询指定的线程是否正在等待获取此锁定

       5、boolean hasQueuedThreads查询是否有线程正在等待获取此锁定

       6、boolean hasWaiters(Condition condition)查询是否有线程正在等待与此锁定有关的condition条件

       7、isFair判断是不是公平锁,默认非公平锁

       8、isHeldByCurrentThread查询当前线程是否保持此锁定,isLocked查询此锁定是否由任意线程保持

       9、lockInterruptibly锁定时如果当前线程未被中断则获取锁定,如果已被中断则出现异常,提lock.lock()

      10、boolean tryLock:仅在调用时锁定 未被另外一个线程保持的情况下 才获取该锁定

                    读这句话真痛苦,目测说的是:只有当前锁没有被锁定时 才能获取当前锁

      11、boolean tryLock(long timeout,TimeUnit unit)在当前线程未被中断的情况下 锁定 未被锁定 的锁

 

condition部分方法:

       1、awaitUninterruptibly,在当前线程锁定的情况下如果被中断则正常运行不会报错

       2、awaitUntil(* *):线程在等待时间到达前,可以被其他线程提前唤醒,获取锁、执行方法

 

TeentrantReadWriteLock:读写锁

         加快运行效率,在某些不需要操作实例变量的方法中,可以使用读写锁来提升运行速度

         接下来都是套路:读相关的锁:共享锁;写相关的锁:排他锁;多个读锁间不互斥、读写互斥、写写互斥

 
  1. private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();

  2.  
  3. public void testMethod() {

  4. try {

  5. readWriteLock.readLock().lock();

  6. System.out.println("宝宝的存在感是打印出来的");

  7. } finally {

  8. readWriteLock.readLock().unlock();

  9.  
  10. }

  11. }

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值