java, mutex

myrka68

в яве мутексы есть?
чё-то я не догоняю, как при помощи synchronized можно полноценно работать

myrka68

вроде что-то наваял...
спецы, оцените правильность


public class Locker {
static private Object mutex;
static private boolean used;
static void lock {
synchronized(mutex) {
while( used ) {
try {
mutex.wait;
}
catch( Exception ex) {
// ggg
}
}
used = true;
}
}

static void unlock {
synchronized(mutex) {
used = false;
mutex.notifyAll;
}
}
static {
mutex = new Object;
used = false;
}
}

myrka68

вот только unlock хотелось бы в деструктор... а их нема (это если не static-ом делать lock

k0nstantin

Так вроде ничо. Зачем только вот эта конструкция: while (used) ...

myrka68

ну а вдруг exception будет

reganap

Из вэйта может быть только один ексепшен - интерраптед ексепшен - и его надо по идее обрабатывать как-то, а у тебя не отличишь, толь нотифай прошел, толи поток инетррапнули.
А так эта конструкция в купе с нотифай олл реализует обычный нотивай (который без олл).
Так что я думаю, что было бы лучше просто использовать синхронизацию по какому-нибудь объекту.

reganap

Класс типа этого имеет смысл писать для того чтобы поиметь метод типа tryLock который не блокируется, такого обычные джавовские мониторы не позволяют. А все остальное на мой взгляд будет выглядедть очевиднее без вспомогоательных классов.

myrka68

наверное, ты прав
но всё же у меня были и есть причины оформит локер в виде отдельного класса:
1. по нему синхронизируются треды из разных классов (это очевидно )
2. сейчас я переделываю это дело из простого локера в локер на чтение запись, для этого оформление в виде отдельного класса горазде проще

reganap

Да, я согласен, для чтения-записи имеет смысл создать класс. На всякий случай скажу, что в Джаве 1.5 сделано много, что раньше люди писали сами. В частности, тебя могут заинтересовать классы:
java.util.concurrent.locks.Lock
java.util.concurrent.locks.ReadWriteLock
там, конечно же, куча других всяких локов, да и весь пакет concurrents интересен.

myrka68

вот это уже офигенная маза
спасибо!
Оставить комментарий
Имя или ник:
Комментарий: