powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / bad pratices. Need help and advices
18 сообщений из 18, страница 1 из 1
bad pratices. Need help and advices
    #37621742
Miha_S7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Выношу на суд разработанный код. Возможно, велосипед, тем не менее интерес пока теоретический - разобраться что к чему и как.
Насколько мне известно, в 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
bad pratices. Need help and advices
    #37621758
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем улавливаю смысл вашей разработки. Чего вы пытаетесь добиться?
...
Рейтинг: 0 / 0
bad pratices. Need help and advices
    #37621784
Miha_S7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svenom,

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

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

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

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

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

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

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

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

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


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