如果需要
Lock支持
tryLock*** 作,则不能使用Java的固有锁定功能。您必须实现自己的
Lock类,该类维护所需的状态,即所有者
Thread和计数器,并可能使用内在锁定来实现其线程安全更新和阻止(在较早的Java版本中没有太多替代方法)。
一个非常简单的实现可能看起来像这样:
public final class Lock { private Thread owner; private int nestCount; public synchronized void lock() throws InterruptedException { for(;;) { if(tryLock()) return; wait(); } } public synchronized boolean tryLock() { Thread me=Thread.currentThread(); if(owner!=me) { if(nestCount!=0) return false; owner=me; } nestCount++; return true; } public synchronized void unlock() { if(owner!=Thread.currentThread()) throw new IllegalMonitorStateException(); if(--nestCount == 0) { owner=null; notify(); } }}
请注意,方法
Lock强制实施的实例的固有锁定
synchronized仅在很短的时间内保持。线程将立即返回或进入
wait暗示释放锁的状态。因此
tryLock,尽管Java
5和更新版本的Java 5可能会更有效,但它们将表现出所需的行为。(Java 5和更高版本的实现
synchronized也更加有效…)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)