《Java多线程编程核心技术》Lock的使用

Posted zczpeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Java多线程编程核心技术》Lock的使用相关的知识,希望对你有一定的参考价值。

1,使用ReentrantLock类

在java中,可以使用synchronized关键字来时间线程之间同步互斥,但在JDK1.5中新增加了ReentrantLock类也能达到同样的效果,并且在扩展功能上也更加强大。关键字synchronized与wait()和notify()/notifyAll()方法结合可以时间等待/通知模式,类ReentrantLock也可以实现,但需要截止Condition对象,Condition类是在JDK5中出现的技术,使用它有更好的灵活性,比如可以实现多路通知功能,也就是在一个Lock对象里创建多个Condition(即对象监视器)实例,线程对象可以注册在指定的Condition中,从而可以有选择行的进行线程通知,在调度线程上更加灵活。

在使用notify()/notifyAll()方法进行通知是,被通知的线程是由JVM随机选择的。但使用ReentrantLock结合Condition类是可以实现前面介绍过的“选择性通知”,这个功能是非常重要的,而且在Condition类中是默认提供的。
而synchronized就相当于整个Lock对象中只有一个单一的Condition对象,所有的线程都注册在它一个对象上,线程开始notifyAll()时,都需要通知所有的WAITING线程,没有选择权,效率低。

注意:要在代码condition.await()方法调用之前调用lock.lock()代码获得同步监视器。

1,Object类中的wait()相当于Condition类中的await()方法。
2,Object类中的wait(long timeout)相当于Condition类中的await(long timeout,TimeUnit unit)方法。
3, Object类中的notify()相当于Condition类中的signal()方法。
4,Object类中的notifyAll()相当于Condition类中的signalAll()方法。

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

方法 int getQueueLength()的作用是返回正等待获取此锁定的线程估计数,比如有5个线程,1个线程首先执行await()方法,那么调用getQueueLength()方法后返回值是4,说明有4个线程同时在等待lock的释放。

方法 int getWaitQueueLength(Condition condition)的作用是返回等待与此锁定相关的给定条件Condition的线程估计数。比如有5个线程,每个线程都执行了同一个condition对象的await()方法,则调用该方法时返回int值为5。

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

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

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

2,使用ReentrantReadWriteLock类

类ReentrantLock具有完全排斥其他的效果,即同一时间只有一个线程在执行ReentrantLock.lock()方法后面的任务。这样做虽然保证了实例变量的线程安全性,但是效率很低。所以在JDK中提供了一种读写锁,ReentrantReadWriteLock类,使用它可以加快运行效率,在某些不需要操作实例变量的方法中,完全可以使用读写锁ReentrantReadWriteLock来提升该方法的代码运行速度。
读写锁表示也有两个锁,一个是读相关的锁,也成为共享锁,另一个是写操作相关的锁,也叫排他锁。就是多个读锁之间不互斥,读锁与写锁互斥,写锁与写锁互斥,在没有线程Thread进行写入操作是,进行读操作的多个Thread都可以获取读锁,而进行写入操作的Thread只有在获取写锁后才能进行写入操作。也就是多个Thread可以同时进行读取操作,但是同一个时刻只允许一个Thread进行写入操作。
“读写”,“写读”和“写写”都是互斥的,只有“读读”是异步的,非互斥.

以上是关于《Java多线程编程核心技术》Lock的使用的主要内容,如果未能解决你的问题,请参考以下文章

java多线程编程核心技术----心得1

Java多线程编程核心技术

5 多线程,原子操作

《java多线程编程核心技术》----ThreadLocal

Java多线程编程核心技术多线程通信

《Java多线程编程核心技术》定时器Timer的使用