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

Lock

     ReentrantLock:

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

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

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

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

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

  private ReentrantLock lock=new ReentrantLock();
    private Condition condition = lock.newCondition();
    public void test1(){
        try {
            lock.lock();//在await调用前调用,获取同步监视器
            System.out.println("刷存在感的来辣~666");
            condition.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

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:读写锁

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

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

   private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();

    public void testMethod() {
        try {
            readWriteLock.readLock().lock();
            System.out.println("宝宝的存在感是打印出来的");
        } finally {
            readWriteLock.readLock().unlock();

        }
    }

嘻嘻,忘了告诉你 写读也是互斥滴,放心遇到写锁就互斥

小结:

      可以使用lock是synchronized的进阶,前者可以替换掉后者,掌握lock你猜会怎么样,此处省略……咳~简单说一下:有助于学习并发包中源代码的实现原理,在并发包中大量的类使用lock接口作为同步处理的方式,试不试狠李海୧(๑•̀◡•́๑)૭然而都是作者说的,谢谢作者的分享^_^

评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值