该篇文章主要内容:
- ReentrantLock类的使用
- ReentrantReadWriteLock类的使用
ReentrantLock类可以认为是synchronized的升级版,在synchronized实现线程之间的同步互斥功能外,还具有嗅探锁定,多路分支通知等功能,而且在使用上也比synchronized更加灵活。
1.1.1:使用ReentrantLock类进行同步实例1:
实例二:
仅修改Test类
Lock相比与synchronized关键字的wait、notify()和notifyAll,它更加的灵活,比如可以实现多路通知功能,即可以在一个Lock对象里面创建多个Condition(对象监视器)实例,线程对象可以注册在指定Condition中,从而可以有选择性地进行线程通知。
注:如果在释放锁之前出现错误,并不会释放锁,所以最好在finally块中释放锁.
Object类中的wait()方法相当与Condition类中的await方法。
Object类中的wait(long timeout)方法相当与Condition类中的await(long time,TimeUnit unit)方法。
Object类中的notify()方法相当与Condition类中的signal()方法。
Object类中的nodifyAll()方法相当与Condition类中的signalAll()方法。
Service类
package com.zjw;
import java.util.ArrayList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Service {
private ReentrantLock lock=new ReentrantLock();
private ArrayList list=new ArrayList<>();
private int i=0;
private ReentrantLock lock2=new ReentrantLock();
private Condition condition1=lock.newCondition();
private Condition condition2=lock.newCondition();
public void setValue(){
try{
lock.lock();
while(list.size()==5){
condition1.await();
}
System.out.println("我是生产者"+Thread.currentThread().getName()+i);
list.add(i++);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
condition2.signal();
lock.unlock();
}
}
public void getValue(){
try{
lock.lock();
while(list.size()==0){
condition2.await();
}
int j=list.remove(0);
System.out.println("我是消费者"+Thread.currentThread().getName()+j);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
condition1.signal();
lock.unlock();
}
}
}
1.1.4: ReentrantLock类的一些其它方法
1、int getHoldCount() :查询当前线程保持此锁定的个数,即调用lock()方法的次数
2、int getQueueLength():返回正等待获取此锁定的线程估计数,比如5个线程,一个调用await()方法,则使用该方法返回值为4,因为有4个线程正同时等待lock的释放。
3、int getWaitQueueLength(Condition condition):返回执行给定condition后锁定的线程数,假设5个线程,3个使用了给定condition的await()相关方法,则返回值为3.
4、boolean hasQueuedThread(Thread thread):是查询指定的线程是否正在等待获取此锁定。
5、boolean hasQueuedThreads(): 查询是否有线程正在等待获取此锁定。
6、boolean hasWaiters(Condition condition):查询是否有线程正在等待此锁定的Condition的signal唤醒。
7、boolean isFair():判断该锁是不是公平锁,默认是非公平锁。
8、boolean isHeldByCurrentThread(): 查询当前线程是否保持此锁定。
9、boolean isLocked(): 查询该锁是否有线程持有。
10、boolean tryLock()与tryLock(long timeout,TimeUnit unit):是尝试获取锁,参数则表示在该时间内尝试,如果没有获取,则放弃获取锁。



