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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树