java显式锁
2016-06-06 14:59
513 查看
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-模拟tomcat服务器
- 用vbscript实现启用 Caps Lock (大写)键
- C#中lock死锁实例教程
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 解析使用C# lock同时访问共享数据
- [Oracle] 浅谈Lock与Latch
- mysql下普通用户备份数据库时无lock tables权限的解决方法
- Android开发笔记之:如何安全中止一个自定义线程Thread的方法
- java thread start()和run()方法简析
- Java中Runnable和Thread的区别分析
- Android开发笔记之:Handler Runnable与Thread的区别详解
- Java多线程实现同时输出
- java多线程编程制作电子时钟
- java多线程入门知识及示例程序
- C#多线程之Thread中Thread.Join()函数用法分析
- C#中的lock、Monitor、Mutex学习笔记
- Mysql Error Code : 1436 Thread stack overrun
- MySQL错误Forcing close of thread的两种解决方法
- c#线程Thread示例
- C#中lock用法详解