Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / bad pratices. Need help and advices / 18 сообщений из 18, страница 1 из 1
19.01.2012, 12:06:36
    #37621742
Miha_S7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
Всем привет!
Выношу на суд разработанный код. Возможно, велосипед, тем не менее интерес пока теоретический - разобраться что к чему и как.
Насколько мне известно, в Java существует проблема, связанная с деструктором классов.
Код: java
1.
protected void finalize() throws Throwable


Он как бы есть, но размещать там "тяжёлый" код и, тем более, связанный с блокированием потока не рекомендуется, что понятно - GC должен заниматься не только этим объектом. Поэтому нужен способ изменить некое состояние, когда объект будет подобран GC, если разработчик забыл это сделать. Проблема решена с применением следующих абстракций:
Код: java
1.
2.
3.
4.
5.
6.
/** Ресурс - состояние, которое необходимо поддерживать в консистентном сотоянии. Имеет только два возможных значения - "открыто" и "закрыто" */
public interface I_Resource {
    I_ResourceDescriptor allocateDescriptor(Object opts);
    int numOpenDescriptors();
    void deallocateAll();
} 


Код: java
1.
2.
3.
4.
5.
6.
7.
/** Дескриптор ресурса - объект, с помощью которого изменяется состояние ресурса */
public interface I_ResourceDescriptor {
    void open();
    void close();
    boolean isOpened();
    I_Resource getResource();
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
/** Владелец ресурсов */
public interface I_ResourceOwner {
    Collection<I_Resource> getResources();
    Collection<I_ResourceDescriptor> getResDescriptors();
    void allocateResources();
    void deallocateResources();
    I_Resource removeResource(I_Resource res);
    I_Resource addResource(I_Resource res);
}


Код: java
1.
2.
3.
4.
5.
/** Пул, в котором регистрируются владельцы ресурсов. Занимается поддержкой консистентности ресурсов */
public interface I_SafeResourcePool {
    int clean();
    I_ResourceOwner registerOwner(I_ResourceOwner o);
}



Иллюстрация использования:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
public class Example {

    private final I_SafeResourcePool pool = new BaseSafeResourcePool();

    public void method() {
        I_ResourceOwner ow = new TResOwner(this.pool);
        for(int i = 0; i < 10; i++) {
            System.out.println("add res");
            ow.addResource(new TIntRes(new Integer(i)));
        }
        ow.allocateResources();
        System.out.println("ow: " + ow);
        //-->> forgot to deallocate. TIntRes objects are in incosistent state
    }

    public static void main(String[] args) throws Exception {
        Example inst = new Example();
    
        inst.method();
        
        inst = null;
        
        for(int i = 0; i < 10; i++) {
            System.out.println("gc");
            System.gc();
            Thread.sleep(500);
        }
        
        System.out.println("THE END");
    }
}




Пример использования, тесты и исходные коды в приложении. Собственно, интересует мнение тех, кто имеет опыт разработки многопоточного/высококонкурентного кода. Какие у меня bad practices получились и как делать правильней.
...
Рейтинг: 0 / 0
19.01.2012, 12:11:25
    #37621758
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
Не совсем улавливаю смысл вашей разработки. Чего вы пытаетесь добиться?
...
Рейтинг: 0 / 0
19.01.2012, 12:18:02
    #37621784
Miha_S7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
svenom,

Если объект никем не используется нужно освободить ресурсы, занимаемые объектом. Это можно сделать либо
вручную(риск забыть)

через деструктор(не рекомендуется помещать в деструктор тяжёлую логику).
Других способов я не знаю.
Суть разработки - снизить риск по 1-му пункту и иметь возможность использовать "тяжёлую" логику по 2-му пункту. Как-то так...
...
Рейтинг: 0 / 0
19.01.2012, 12:26:14
    #37621809
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
Ну, попробовали бы изучить вопрос прежде чем что-то делать.
Материала валом. Вот, например.
http://java.sun.com/developer/technicalArticles/javase/finalization/
http://www.javapractices.com/topic/TopicAction.do?Id=24
...
Рейтинг: 0 / 0
19.01.2012, 13:20:11
    #37622005
Miha_S7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
Blazkowicz,

ну там же только декларируются концепции. А может и реализация этих концепций есть? Поискал в гугле, близко нашёл только вот это . Но мне там много чего не нравится.
...
Рейтинг: 0 / 0
19.01.2012, 13:47:49
    #37622103
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
ну еще как вариант перейти на java7 и использовать AutoClosable
...
Рейтинг: 0 / 0
19.01.2012, 13:53:51
    #37622125
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
забыл никну еще как вариант перейти на java7 и использовать AutoClosable
Ну, его же всё равно в try\catch надо оборачивать. А вдруг кто забудет?
...
Рейтинг: 0 / 0
19.01.2012, 13:57:08
    #37622137
Miha_S7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
забыл ник,

мне, всё-таки, кажется, что не всегда работа с объектом в интервале времени "выделил"---"освободил" умещается в рамки одного блока. По сути AutoCloseable + try-with-resources = упрощённый try-finally и имеет те же недостатки.
...
Рейтинг: 0 / 0
19.01.2012, 14:00:19
    #37622151
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
Miha_S7ну там же только декларируются концепции. А может и реализация этих концепций есть?
Ну, если через пул, то вот готовый код, можно дополнить всем что нужно.
http://commons.apache.org/pool/
finilize это не дестрктор.
в вашем коде не используется finilize, поэтому вопрос что именно вы делаете остаётся открытым.
...
Рейтинг: 0 / 0
19.01.2012, 14:01:27
    #37622158
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
Miha_S7забыл ник,

мне, всё-таки, кажется, что не всегда работа с объектом в интервале времени "выделил"---"освободил" умещается в рамки одного блока. По сути AutoCloseable + try-with-resources = упрощённый try-finally и имеет те же недостатки.

Точно так же как девелопер забывает закрывать ресурс, он забудет зерегистрировать его в вашем пуле. В чем бенефиты?
...
Рейтинг: 0 / 0
19.01.2012, 14:08:26
    #37622177
Miha_S7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
Blazkowicz,

виноват, не деструктор. finalize не используется. Используются WeakReference и ReferenceQueue. Дополнить http://commons.apache.org/pool/ можно, но я пока не стал этим заниматься, так как хотелось для начала попрактиковаться. А лишний код будет в этом только мешать.
Я не говорю, что подобный риск можно полностью устранить, но снизить можно. Например, используя фабрику для создания объектов.
...
Рейтинг: 0 / 0
19.01.2012, 14:16:32
    #37622199
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
Miha_S7Используются WeakReference и ReferenceQueue.
Тю. В первом посте про слабые ссылки ни слова. Тогда ОК. Правильно копаете, и - да, лучше через фабрику создавать.
...
Рейтинг: 0 / 0
19.01.2012, 16:11:51
    #37622560
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
...
Рейтинг: 0 / 0
19.01.2012, 16:29:33
    #37622625
Miha_S7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
забыл ник,

не смотрел, но судя по беглому взгляду, что-то похожее. Будем разбираться...
спасибо.
...
Рейтинг: 0 / 0
19.01.2012, 16:57:42
    #37622714
Miha_S7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
Miha_S7,

да, это то, что нужно. И сделано грамотней, чем у меня. Ну что ж, хорошо, что есть где посмотреть и поучиться :-)
...
Рейтинг: 0 / 0
19.01.2012, 18:39:32
    #37622948
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
Ну я считаю, что иногда очень полезно написать велосипед, чтобы понять как оно все работает и оценить преимущества библиотечного кода:) Кстати, посомтрел твой код - если это сделано на скорую руку - то впечатляет)
...
Рейтинг: 0 / 0
20.01.2012, 14:27:39
    #37624129
Miha_S7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
com.google.common.base.FinalizableReference и др. сделаны по образу и подобию классов в пакете java.lang.ref из OpenJDK. Всем, кому интересно, чем же отличается PhantomReference от WeakReference и каким образом VM финализирует объекты, советую заглянуть.
...
Рейтинг: 0 / 0
09.02.2012, 15:31:53
    #37654019
Miha_S7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bad pratices. Need help and advices
Переделано. Устранены недостатки guava-вского метода, в котором существует возможность, что часть объектов не будет "финализировано" (не в смысле вызова метода finalize()). А также убран рефлекшн, который мне кажется лишним.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / bad pratices. Need help and advices / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]