Java中的锁

来源:互联网 发布:php安装教程 linux 编辑:程序博客网 时间:2024/06/13 21:48

一、Lock锁
1.锁的用途:控制多线程并发访问共享资源的的一种方式。
2.什么叫隐式锁,什么叫显示锁
隐式锁:使用这把锁时,不需要显示的对锁进行获取和释放,就可以完成锁的功能。比如synchronized。
显示锁:正好相反,代码要显示的调用这把锁的各种控制方法,才可以完成相应的功能。比如Lock锁。

二、Lock锁的基本用法

lock.lock();
//一定要放在try外面,主要是因为如果放在内部,一旦获取锁异常,
//在unlock时,会产生IllegalMonitorStateException异常,即非法状态监视器异常。
try
{
….
}
finally{
lock.unlock();
}

三、Lock显示锁与synchronized比较

1.尝试非阻塞的获取锁:意指当前线程尝试获取锁,如果当前时刻没有线程占有这把锁,则成功获取锁,并立即返回。

2.能被中断的获取所:意指当或得所得线程,被中断时,中断异常抛出,同时占有的锁也被释放。

3.超时获取锁:在指定的时间内获取锁,所过超时未获取,则返回。

四、几个常见API

1.lock()
2.unlock()
3.tryLock()
4.new Condition()

五、重入锁,即ReentrantLock
1.含义:当一个线程占有琐时,然后该线程可以连续多次获取该锁。

六:公平锁和非公平锁
1.公平锁:采用先请求先得到FIFO的策略,效率低,吞吐量低。

2.非公平锁:与公平锁相反。

ReentrantLock锁默认是非公平的,在其构造函数里可以指定公平与否。