建设公司网站征集信息的通知,欧美风格的网页设计欣赏,可信的移动网站建设,免费下载app软件的网站【1】Lock接口文档描述
1.相比于使用synchronized方法和代码块#xff0c;锁的出现提供了更广泛的锁操作。
锁允许更灵活的代码结构#xff0c;具有许多不同的属性#xff0c;还支持多个关联的Condition条件对象。
2.锁是用于控制多个线程访问共享资源的工具。通常#…【1】Lock接口文档描述
1.相比于使用synchronized方法和代码块锁的出现提供了更广泛的锁操作。
锁允许更灵活的代码结构具有许多不同的属性还支持多个关联的Condition条件对象。
2.锁是用于控制多个线程访问共享资源的工具。通常锁提供了对共享资源的独占排他访问即某一时刻只能有1个线程可以获得锁所有对共享资源的访问都必须事先获得锁。
然而一些锁允许对共享资源的并发访问如读写锁 ReadWriteLock的读锁。
3.使用synchronized方法或代码块进行并发控制实际是对每个对象的隐式监视器锁monitorentermonitorexit的访问且强制让锁的获取与释放发生在块结构中。当获取了多个锁这些锁需要相反的顺序释放。而且所有锁必须在它们被获取时的作用域里释放
4.虽然 synchronized方法与代码块的作用域机制使得使用监视器锁编码更加容易也有助于避免许多常见的涉及锁的变成错误但某些情况下你需要以更加灵活的方式使用锁。
如一些并发遍历数据结构的算法需要使用 交叉hand-over-hand或链锁chain lock你先获取节点A的锁接着B然后释放A获取C然后释放B....等等。 还比如使用可中断方式或非阻塞方式获取锁或超时方式获取锁超时前阻塞超时后立即返回无论获取锁与否而不是像 synchronized那样一直阻塞不可中断没有超时机制非常死板干货——为什么需要使用Lock而不是synchronized实现锁 Lock接口的实现允许在不同的作用域获取和释放锁并允许以任意顺序获取和释放锁。 Lock接口 与 synchronized 进行并发控制的最大区别小结
synchronized获取锁与释放锁在同一个作用域内代码块内且锁的释放顺序必须与获取顺序相反字节码指令 monitorenter加锁monitorexit解锁Lock接口 获取锁与释放锁可以在不同的作用域内 锁的释放顺序与获取顺序任意Lock接口方法lock()加锁unlock()解锁
5.这种增加的灵活性带来了额外的责任。Lock接口没有使用代码块结构这样消除了synchronized中的锁自动释放功能。
6.在大多数情况下应该使用以下语句进行 Lock对象的锁获取与释放 Lock l ...;l.lock();try {// access the resource protected by this lock} finally {l.unlock();}
7.当锁的获取与释放发生在不同作用域时需要特别注意让持有锁时执行的所有代码都在 try-finally 或 try-catch 块中受到保护以确保必要时释放锁
8.Lock的实现比synchronized多提供了其他方法更加灵活或者两者的不同点如
tryLock()方法-通过非阻塞方式尝试获取锁
lockInterruptibly() 方法-尝试获取的锁获取过程可被中断
tryLock(long time, TimeUnit unit) -有超时限制的尝试获取锁超时后立即返回不会一直阻塞
9.Lock还提供了与隐式监视器锁不同的行为和语义如保证有序非重入使用死锁检测。如果锁的实现提供了这样专门的语义则该实现必须记录这些语义。
10.注意 Lock实例仅仅是普通对象Lock对象本身可以作为synchronized语句的目标对象如
synchronized(LockIntance){...}
获取Lock实例的监视器锁与 调用Lock实例的lock方法没有关系。墙裂建议不要在 synchronized语句块中获取Lock实例的监视器锁以避免混淆。
11.内存同步
所有Lock的实现都必须强制相同的内存同步语义内存可见性就像内建的监视器锁一样据java语言规范所描述的那样成功的锁定操作与成功的Lock动作有相同的内存同步效果不成功的锁定操作与不成功的UnLock动作有相同的内存同步效果。不成功的加锁和解锁操作可重入加锁和解锁操作不要求任何的内存同步效果
12. Lock实现类注意事项
获取Lock锁的3种方式包括可中断不可中断超时在性能特征顺序保证和其他方面都不相同。此外在给定Lock类中可能无法中断获取锁的过程。因此不需要为3种方式定义相同的保证与语义也不需要支持对锁获取的中断。锁的实现需要清楚记录每个锁方法的语义和保证。Lock实现类也必须遵守如接口中定义的中断语义当需要支持锁获取的中断的时候完全或仅有一个方法入口。
13.中断意味着取消但中断检测不常发生因此锁的实现Lock接口实现类倾向于响应中断而不是从方法返回。
即使证明了另一个动作之后发生的中断会解除线程阻塞也是如此。锁的实现应该记录这些行为。 【2】Lock方法描述
【2.1】void lock()
获取锁如果锁不可用获取锁失败则当前线程将被线程调度器禁用并休眠直到可以获得锁当前线程阻塞
Lock接口实现类注意事项
Lock接口的实现类可能探测到锁的错误使用如死锁并在这种情况下抛出异常未检测异常。Lock的实现必须记录这种情况和异常类型。 【2.2】void lockInterruptibly() throws InterruptedException;
1.获取锁除非当前线程中断
2.如果锁可用则获取锁并立即返回。
3.如果锁不可用获取锁失败则当前线程将被线程调度器禁用并休眠直到出现以下两种情况之一当前线程阻塞。
情况1当前线程获取锁情况2某个其他线程中断了当前线程当Lock实现类支持获取锁时的中断
4.如果当前线程
在方法入口设置了中断状态或者在获取锁时被中断了则会该线程抛出 中断异常InterruptedException且其中断状态被清除。
5.Lock实现类注意事项
在某些Lock接口的实现类中中断一个获取锁的线程是不可能的如果可能那也是非常昂贵的操作。程序员应该注意这种情况。Lock的实现也应该记录这种情况。
6.与正常方法返回相比Lock实现类更倾向于响应中断
7.Lock实现类可能探测到锁的错误使用如死锁并在这种情况下抛出异常未检测异常。Lock的实现类必须记录这种情况和异常类型。
8.抛出异常
InterruptedException-可中断异常若当前线程在获取锁时被中断了 【2.3】boolean tryLock()
1.只要当前线程调用该方法时锁是空闲的则获取锁
2.如果锁可用则获取锁并立即返回true如果锁不可用则立即返回flase当前线程不会阻塞
3.典型用法如下
Lock lock ...;if (lock.tryLock()) {try {// 操作保护的状态} finally {lock.unlock();}} else {// 执行替代操作 }
这种用法确保了在获取锁时可以解锁在没有获取锁时不会尝试解锁。
返回若获取锁返回true否则返回false 【2.4】boolean tryLock(long time, TimeUnit unit) throws InterruptedException
1.如果锁在给定等待时间内是空闲的且当前线程没有被中断则当前线程获取锁
2.若锁可用该方法立即返回true。若锁不可用则当前线程无法被调度器调度且会阻塞直到发生以下3种情况之一当前线程阻塞
情况1 当前线程获取锁情况2 其他线程中断当前线程当Lock实现类支持锁获取时的中断情况3经过了给定等待时间成功获取了锁则立即返回true
3.如果当前线程
在方法入口设置了中断状态或者当前线程在获取锁时被中断了当Lock实现类支持获取锁时的中断则该线程抛出 中断异常InterruptedException且中断状态被清除。
4.与正常方法返回或报告超时相比Lock实现类更倾向于响应中断
5.Lock接口的实现类可能探测到锁的错误使用如死锁并在这种情况下可能抛出异常未检测异常。Lock的实现类必须记录这种情况和异常类型。
6.参数列表
time 等待锁可用的最大时间unit time的时间单位如时、分、秒
7.返回
若获取到锁返回true若经过等待时间没有获取到锁返回false
8.抛出异常
InterruptedException-可中断异常若当前线程在获取锁时被中断了当Lock实现类可以支持获取锁时的中断 【2.5】void unlock() -释放锁。
1.Lock实现类的注意事项
Lock实现类通常会对释放锁的线程施加限制典型情况是只有锁的持有者可以释放锁且若违反限制则可能抛出异常unchecked。
Lock实现类必须记录任何限制和异常。 【2.6】Condition newCondition()
1.返回绑定到此Lock实例的新的Condition实例。
2.在等待condition之前当前线程必须持有锁。
3.调用Condition.await() 方法会在等待之前自动释放锁并在等待返回之前重新获取锁
4.Lock实现类注意事项
Condition实例的正确操作依赖于Lock的实现类。Lock实现类必须记录这些操作。
5.返回
该Lock实例的新的Condition实例
6.抛出异常
UnsupportedOperationException-不支持的操作异常-若锁实现类不支持 condition 【3】Lock方法总结
【3.1】Lock获取锁方法
方法描述 当前线程 是否阻塞 void lock()获取锁如果锁不可用获取锁失败则当前线程将被线程调度器禁用并休眠直到可以获得锁当前线程阻塞阻塞不可中断void lockInterruptibly() throws InterruptedException 1.获取锁除非当前线程中断 2.如果锁可用则获取锁并立即返回。 3.如果锁不可用获取锁失败则当前线程将被线程调度器禁用并休眠直到出现以下两种情况之一当前线程阻塞。 情况1当前线程获取锁 情况2某个其他线程中断了当前线程当Lock实现类支持获取锁时的中断 阻塞 但可中断 boolean tryLock()1.只要当前线程调用该方法时锁是空闲的则当前线程获得锁 2.如果锁可用则获取锁并立即返回true如果锁不可用则立即返回flase当前线程不会阻塞不阻塞boolean tryLock(long time, TimeUnit unit) throws InterruptedException 1.如果锁在给定等待时间内是空闲的且当前线程没有被中断则当前线程获取锁 2.若锁可用该方法立即返回true。若锁不可用则当前线程无法被调度器调度且会阻塞直到发生以下3种情况之一当前线程阻塞 情况1 当前线程获取锁 情况2 其他线程中断当前线程当Lock的实现类支持锁获取时的中断 情况3经过了给定等待时间成功获取了锁则立即返回true若没有获取到锁则返回false 阻塞 可中断且超时后立即返回无论获取锁与否 【3.2】Lock其他方法
void unlock释放锁
Condition newCondition() 获取新的Condition实例