资讯专栏INFORMATION COLUMN

Java 多线程编程核心技术4—Lock

zhichangterry / 2385人阅读

摘要:调用代码的线程就持有了对象监视器,其他线程只有等待锁被释放时再次争抢。使用多个对象,可以唤醒部分指定线程,有助于提升程序运行的效率。方法的作用是返回等待与此锁定相关给定条件的线程估计数。线程在等待时间到达前,可以被其他线程提前唤醒。

调用lock.lock()代码的线程就持有了“对象监视器”,其他线程只有等待锁被释放时再次争抢。效果和使用synchronized关键字一样,线程之间执行的顺序是随机的。

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

Condition类具有更好的灵活性,比如可以实现多路通知功能,也就是在一个Lock对象里可以创建多个Condition(即对象监视器)实例,线程对象可以注册在指定的Conditionzhong,从而可以有选择性地进行线程通知,在调度上更加灵活。

使用ReentrantLock结合Condition类是可以实现前面介绍过的“选择性通知”,这个功能是非常重要的,而且在Conditon类中默认提供的。

异常IllegalMonitorStateException是监视器出错,解决的办法是必须在condition.await()方法调用之前调用lock.lock()代码获取同步监视器。

调用了Condition对象的await()方法,使当前执行任务的线程进入了等待waiting状态。

Object类中的wait()方法相当于Condition类中的await()方法。

Objcet类中的wait(long)方法相当于Condition类中的await(long,timeUni)

Objcet类中的notify()方法相当于Condition类中的signal()方法。

Objcet类中的notifyAll()方法相当于Condition类中的signalAll()方法。

使用多个Condition对象,可以唤醒部分指定线程,有助于提升程序运行的效率。可以先对线程进行分组,然后再唤醒指定组中的线程。

使用ReentrantLock对象可以唤醒指定种类的线程,这是控制部分线程行为的方便方式。

锁Lock分为“公平锁”和“非公平锁”,公平锁表示线程获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得的FIFO先进先出顺序。而非公平锁就是一种获取锁的抢占机制,是随机获取锁的,和公平锁不一样的就是先来的不一定先得到锁,这种方式可能造成某些线程一种拿不到锁,结果也就是不公平的了。

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

方法int getQueueLength()的作用是返回正等待获取此锁定的线程估计数。

方法int getWaitQueueLength(Condition condition)的作用是返回等待与此锁定相关给定条件Condition的线程估计数。

方法boolean hasQueuedThread(Thread thread)的作用是查询指定的线程是否正在等待获取此锁定。

方法boolean hasQueuedThreads()的作用是查询是否有线程正在等待获取此锁定。

方法boolean hasWaiters(Condition condition)的作用是查询是否有线程正在等待与此锁定有关的condition条件。

方法boolean isFair()的作用是判断是不是公平锁。在默认的情况下,ReentrantLock类使用的非公平锁。

方法boolean isHeldByCurrentThread()的作用是查询当前线程是否保持此锁定。

方法boolean isLocked()的作用是查询此锁定是否由任意线程保持。

方法void lockInterruptibly()的作用是:如果当前线程未被中断,则获取锁定,如果已经被中断则抛出异常。

方法boolean tryLock()的作用是,仅在调用时锁定未被另一个线程保持的情况下,才获取该锁定。

方法boolean try(long timeout,TimeUnit unit)的作用是,如果锁定在给定等待时间内没有被另一个线程保持,且当前线程未被中断,则获取该锁定。

线程在等待时间到达前,可以被其他线程提前唤醒。

在某些不需要操作实例变量的方法中,完全可以使用读写锁ReentrantReadWriteLock来提升该方法的代码运行效率。

在读写锁中,“读写”,“写读”,和“写写”都是互斥的;而“读读”是异步的,非互斥的。

在并发包中大量的类使用了Lock接口作为同步的处理方式。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68207.html

相关文章

  • 线程编程核心技术线程的死锁

    摘要:使用工具监测死锁进入的安装目录中的目录,执行命令可以看出得到运行的线程的值为,再执行命令,查看结果 死锁 Java 线程是死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续完成 举个例子 DealThread.java package dealThread.demo; public class DealThread implement...

    tabalt 评论0 收藏0
  • Java锁机制了解一下

    摘要:底层是是通过对象,对象有自己的对象头,存储了很多信息,其中一个信息标示是被哪个线程持有。当一个线程执行的代码出现异常时,其所持有的锁会自动释放。 前言 回顾前面: 多线程三分钟就可以入个门了! Thread源码剖析 多线程基础必要知识点!看了学习多线程事半功倍 只有光头才能变强! 本文章主要讲的是Java多线程加锁机制,有两种: Synchronized 显式Lock 不得不唠...

    hyuan 评论0 收藏0
  • java线程编程核心技术 2

    摘要:在两个线程访问同一个对象中的同步方法时一定是线程安全的。当一个线程访问的一个同步代码块时,其他线程对同一个钟所有其他同步代码块的访问被阻塞,这说明使用的对象监视器是一个。 非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是脏读,也就是取到的数据其实是被更改过的。而线程安全就是以获得的实例变量的值是经过同步处理的,不会出现脏读的现象。 非线程安全问题存...

    wangxinarhat 评论0 收藏0
  • [Java并发-6]“管程”-java管程初探

    摘要:语言在之前,提供的唯一的并发原语就是管程,而且之后提供的并发包,也是以管程技术为基础的。但是管程更容易使用,所以选择了管程。线程进入条件变量的等待队列后,是允许其他线程进入管程的。并发编程里两大核心问题互斥和同步,都可以由管程来帮你解决。 并发编程这个技术领域已经发展了半个世纪了。有没有一种核心技术可以很方便地解决我们的并发问题呢?这个问题, 我会选择 Monitor(管程)技术。Ja...

    Steve_Wang_ 评论0 收藏0
  • Java线程学习(四)等待/通知(wait/notify)机制

    摘要:运行可运行状态的线程获得了时间片,执行程序代码。阻塞的情况分三种一等待阻塞运行的线程执行方法,会把该线程放入等待队列中。死亡线程方法执行结束,或者因异常退出了方法,则该线程结束生命周期。死亡的线程不可再次复生。 系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键...

    PiscesYE 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<