Блокировка для JavaME - PullRequest
       2

Блокировка для JavaME

3 голосов
/ 08 марта 2012

Мне нужна простая блокировка с тайм-аутом для JavaME (для обратного порта concurrent.lock требуется полная версия 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 Ответ

3 голосов
/ 09 марта 2012

Вы разрабатываете API. Не синхронизировать на общедоступном объекте.

Если кто-то создаст экземпляр вашего TimedLock и синхронизирует его, он перестанет работать так, как вы ожидаете.

TimedLock требуется внутренний закрытый объект для его реализации для синхронизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...