我需要一个简单的锁,并且JavaME超时(并发锁的backport需要完整的Java 1.3)。
如果其他人已经发布了经过测试的JavaME锁定代码,我宁愿使用它。
锁定非常困难,因此我想问一下以下代码是否合理:
公共类TimedLock {
私有volatile线程持有者= null;
私人Vector服务员= new Vector();
公共无效锁(长毫秒){
已同步(this){
if(holder == null){
持有人= Thread.currentThread();
返回;
}
}
waiters.addElement(Thread.currentThread());
尝试{
Thread.sleep(ms);
抛出新的RuntimeException(“等待锁时超时”);
} catch(InterruptedException e){
返回;
}
}
公开同步的void unlock(){
if(holder!= Thread.currentThread()){
抛出新的RuntimeException(“试图释放未持有的锁”);
}
//如果至少有一个服务员,则将其唤醒
如果(waiters.size()> 0){
持有人=(线程)waiters.elementAt(waiters.size()-1);
waiters.removeElementAt(waiters.size()-1);
holder.interrupt();
}其他{
持有人= null;
}
}
}
最佳答案
您正在开发API。不要在公共对象上同步。
如果有人实例化您的TimedLock之一并对其进行同步,则它将停止按您期望的方式工作。
TimedLock需要内部私有对象来实现其同步。