jdk并发工具包之锁
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jdk并发工具包之锁相关的知识,希望对你有一定的参考价值。
1、cynchronized扩展:可重如锁ReentrantLock
ReentrantLock是通过cas算法实现的
RenntrantLock lock=new ReentrantLock();
lock.lock();//如果资源被占用则会等待
//代码锁定区域
finally{
//必须手动解锁
lock.unlock();
}
(1)中断锁
ReentrantLock 提供了可中断锁lockInterruptibly
lock.lockInterruptibly();//会获得锁,但是会优先相应中断
lock.unlock();
当当前线程终端会释放锁
(2)显示等待锁tryLock();
tryLock()会申请锁,如果无法获得锁,将返回false
tryLock也可以设置尝试一段时间获取锁
(3)公平锁 fair
在创建ReentrantLock的时候,有一个构造方法ReentrantLock(boolean fair);默认为false,如果传入true则表示使用公平锁
2、Condition
Condition是搭配ReentrantLock搭配使用的,用于控制当前ReentrantLock锁是否释放,是否被唤起。
ReentrantLock lock=new ReentrantLock();
Condition condition=lock.newCondition();
lock.lock();
condition.await()//会立即释放lock,进入等待状态,直到signal或者signalAll唤醒;
//condition.awaitUninteruptily();用法与await基本相同,但是不会在等待过程中响应中断
//锁定代码
finally
lock.unlock
3、信号量Semaphone,允许多个线程同时访问
ReentrantLock和synchronized锁定之后,至允许一个线程访问,而Semaphone是允许多个线程同时访问;
Semaphone(int permits)//permits为许可数量,允许同时有permits访问
Semaphone(int permits,boolean fair)//fair表示是否公平
Semaphone中的主要方法有
acquire();尝试获得一个许可,如果无法获得,则会等待;
release();当线程执行完成之后释放一个许可
tryacquire();尝试获得一个许可,如果获取到返回true;否则返回false;
tryacqurie(timeout,unit);在制定时间内尝试获得一个许可;
acquireUninterrupt();用法与acquire一致,但是不会相应中断;
以上是关于jdk并发工具包之锁的主要内容,如果未能解决你的问题,请参考以下文章