再回首Java第十七天

同步锁
JDk1.5之后,java提供了另一种线程同步机制:它通过显式定义同步锁对象来实现线程同步,在这种机制下,同步锁应该使用Lock对象充当。
通常认为:Lock提供了比synchronized方法和synchronized代码块更广泛的操作,Lock实现允许更灵活的结构,可以具有很大的差别的属性,并且可以支持多个相关的Condition对象
Lock是控制多个线程对共享资源进行访问的工具。通常Lock提供了对共享资源的独占访问,每次只允许一个线程对Lock对象加锁,线程访问共享资源之前应先获得Lock对象,不过某些Lock可能允许共享资源的并发访问,如ReadWriteLock(读写锁),当然在实现线程安全控制中通常喜欢使用ReentrantLock(可重入锁)通常使用Lock的代码格式如下
class X{
//定义锁对象
private final ReentrantLock lock=new ReentrantLock();
//需要保证线程的方法
public void m(){
lock.lock();
try{
//需呀保证线程安全的代码块
.....
}finally{
lock.unlock()
}
}
使用Lock对象进行同步是,锁定和释放锁出现在不同作用范围中时,通常建议使用finally块来确保在必要时释放锁
使用Lock与使用同步方法有点类似,只是使用Lock是显式的指定Lock对象作为同步锁,而使用同步方法时隐式地使用当前对象作为同步监视器
同步方法和同步代码块使用与竞争资源相关的,隐式的同步监视器,并且强制要求加锁和释放锁要出现在同一个块结构中,而且当获取了多个锁是,它们必须以相反的顺序释放,且必须在所有锁被获取是相同的范围内释放锁。
Lock提供了同步方法和同步代码块没有的功能,包括用于非块结构的tryLock方法,以及试图获取可中断锁的lockInterruptibly()方法,还有获取超时失效所的tryLock(long,TimeUnit)方法
ReentrantLock锁具有重入性,也就是线程可以对已经加锁的ReentrantLock锁再次加锁,ReentrantLock会维持一个计数器来跟踪Lock方法的嵌套调用,线程在每次lock()加锁后,必须显式调用unLock()来释放锁,所一段被锁保护的代码可以调用另一个被相同锁保护的方法

posted @ 2016-04-24 23:37  刀口一人  阅读(120)  评论(0编辑  收藏  举报