java显式锁
Posted 空方块
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java显式锁相关的知识,希望对你有一定的参考价值。
1.Lock和ReentrantLock
1.1.Lock接口:
public interface Lock
void lock();
void lockInterruptibly() throws InterruptedException;
boolean tryLock();
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
void unlock();
Condition newCondition();
ReentrantLock实现了Lock接口,提供了与synchronized相同的互斥和内存可见性的保证。
ReentrantLock比synchronized实现了更加灵活的加锁机制,提供更好的活跃度和性能。
1.2.可中断的锁获取操作
tryLock加锁操作:
Lock lock = ...;
if (lock.tryLock())
try
// manipulate protected state
finally
lock.unlock();
else
// perform alternative actions
lockInterruptibly的加锁操作:
Lock lock = ...;
lock.lockInterruptibly();
try
// manipulate protected state
finally
lock.unlock();
Note:
#1:tryLock()、tryLock(long time, TimeUnit unit)和lockInterruptibly()都是响应中断的。
#2:如果无法取得Lock的时候,要执行其他的task,可以使用tryLock()这个method。
2.ReentrantLock的公平性
public class ReentrantLock implements lock
public int getHoldCount();//当前线程对lock的要求数量,0表示当前线程未持有,不代表lock是自由的
public boolean isLocked();//lock是否是自由的
public boolean isHeldByCurrentThread();//是否由当前线程所持有
public int getQueueLength();//多少个thread在等待取得此lock的估计值
#1:ReentrantLock构造函数提供了俩种公平性,非公平(默认)和公平。
#2:在大多数的情况下,非公平锁性能的优势超过了公平锁。
#3:即使是公平锁,使用tryLock()也会发生闯入。
#4:如果lock的请求是由当前占有lock的thread所发出,则会对内部的nested lock要求计数递增,调用unlock()方法会递减此计数。此lock在计数减到0之前是不会被释放掉的。
3.Synchronized和ReentrantLock之间的选择
ReentrantLock的优势:
#1:ReentrantLock与synchronized在加锁和内存语义上是相同的。
#2:ReentrantLock还提供了定时锁的等待,可中断锁的等待,公平性,非块结构。
#3:在性能上,Java 6 中时略生过synchronized,而在java 5中时大大超越。
ReentrantLock的缺点:
#1:易忘记,finally块中调用unlock()。
Note:当需要可定时、可轮询、可中断、公平性或非块结构的锁时,选用ReentrantLock,否则请使用synchronized。
4.读写锁
读-写、写-写冲突。
以上是关于java显式锁的主要内容,如果未能解决你的问题,请参考以下文章