您的位置:首页 > 编程语言 > Java开发

java Lock(显示锁)

2016-04-26 23:33 309 查看

1.显示锁与内置锁对比

内置锁在代码块调用结束后会自动释放锁,但是显示锁必须自己控制加锁和释放锁,因此使用显示锁更加危险(忘记释放锁)。

内置锁不支持中断,阻塞的线程会一直等待直到拥有锁。而显示锁支持中断并且在处理锁的不可用问题上更加灵活(例如调用tryLock不会阻塞并且可以定时和轮询)。

显示锁并不能代替内置锁,只有当内置锁不能满足需求是才可以考虑显示锁。内置锁要比显示锁更安全,内置锁作为JVM的内置属性,可以检测死锁,但是显示锁不行。

内置锁和显示锁都支持重入。

2.显示锁的基本功能

public interface Lock {
void lock();
void lockInterruptibly() throws InterruptedException;
boolean tryLock();
boolean tryLock(long timeout, TimeUnit unit)() throws InterruptedException;;
void unLock();
Condition newCondition();
}


lock()与内置锁类似,如果请求不到锁会阻塞并且不支持中断。

lockInterruptibly()请求加锁,如果请求不到锁会发生阻塞,在阻塞过程中允许中断。

tryLock()请求加锁,如果加锁不成功会返回false,不会发生阻塞。

tryLock(long timeout, TimeUnit unit)()请求加锁,如果加锁不成功会在规定的时间内阻塞,超时后会返回,支持中断。

unLock()不论选择哪种请求加锁方式,都必须使用unLock释放锁。

ReentrantLock是Lock接口的实现类。

3. 读锁和写锁

读锁允许多个线程同时读取,但是写锁只允许一个线程占用,因此,一个资源可以被多个读操作访问,或者被一个写操作访问,并且读写不能同时进行。在多处理器环境被频繁读取的数据结构,使用读锁和写锁结合使用会提高性能,但是在其他情况下,读锁和写锁的性能不如独占锁,因为读锁写锁的复杂性更高。

ReentrantReadWriteLock

Acquisition order:分为公平模式和不公平模式,不公平模式读线程和写线程获得读锁和写锁的顺序不确定,但是性能要优于公平模式。公平模式下读线程需要等到前面所有的写线程都执行完毕释放写锁。但是不用等前面的读线程执行完毕。而写线程需要等到前面的读线程和写线程全部执行完毕。

Reentrancy:读锁和写锁都支持重入,读锁重入读锁,写锁重入写锁。写锁重入读锁但是不可以读锁重入写锁。

Lock downgrading:获得读锁可以降级为写锁,即先请求写锁,然后获得读锁并释放写锁。但是读锁不能升级为写锁。

Interruption of lock acquisition:读锁和写锁都支持中断。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 线程