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接口作为同步处理的方式,试不试狠李海୧(๑•̀◡•́๑)૭然而都是作者说的,谢谢作者的分享^_^