锁定JavaME

时间:2012-03-08 11:05:57

标签: java java-me locking

我需要一个简单的锁,JavaME的超时(concurrent.lock的backport需要完整的Java 1.3)。

如果其他人已经为JavaME发布了经过测试的锁定代码,我宁愿使用它。

锁定是非常困难的,所以我想我会问以下代码是否理智:

public class TimedLock {
    private volatile Thread holder = null;
    private Vector waiters = new Vector();

    public void lock(long ms) {
        synchronized (this) {
            if (holder == null) {
                holder = Thread.currentThread();
                return;
            }       
        }
        waiters.addElement(Thread.currentThread());
        try {
            Thread.sleep(ms);
            throw new RuntimeException("timeout while waiting for lock");
        } catch (InterruptedException e) {
            return;
        }
    }

    public synchronized void unlock() {
        if (holder != Thread.currentThread()) {
            throw new RuntimeException("attempting to release unheld lock");
        }
        // if there is at least one waiter, wake it 
        if (waiters.size() > 0) {
            holder = (Thread) waiters.elementAt(waiters.size() - 1);
            waiters.removeElementAt(waiters.size() - 1);
            holder.interrupt();
        } else {
            holder = null;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

您正在开发API。不要在公共对象上同步。

如果某人实例化了你的一个TimedLock并在其上进行同步,那么它将按照你期望的方式停止工作。

TimedLock需要一个内部私有Object来实现其同步。