Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Статик-константа в многопоточном проложении, будут липроблемы при инициализации конст 
:(
    Опции темы
UnicornMirage
Дата 11.12.2006, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 15.11.2005

Репутация: 1
Всего: 1



Привет всем!

есть такой код (вид синглетона):
Код

/**
 * Класс синглетона с public-ссылкой на его экземпляр
 **/
public class Attribute {
    public final static Attribute EMPTY = new Attribute();


    private Attribute() {
        System.out.println("create new Attribute");
    }

    .....

}


также есть куча классов, использующих данный синглетон:
Код

class SomeA {
     private Attribute a = Attribute.EMPTY;
}

...

class SomeB {
     private Attribute b = Attribute.EMPTY;
}



вопрос связан с проблемой создания экземпляра синглетона в многопоточной среде, в которой необходимо синхронизировать процесс создания объекта.
Будет ли приведенный здесь способ корректен если объекты классов SomeA, SomeB... выполняются в разных потоках? 
PM MAIL   Вверх
powerOn
Дата 11.12.2006, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(UnicornMirage @  11.12.2006,  00:47 Найти цитируемый пост)
Будет ли приведенный здесь способ корректен если объекты классов SomeA, SomeB... выполняются в разных потоках?  


Вот поставил эксперимент:
Код

public class Main implements Runnable {

    public Main() {
    }

    public static void main(String[] args) {
        new Thread(new Main()).start();
        new Thread(new Main()).start();
    }

    public void run() {
        System.out.println("Thread running");
        Attribute a = Attribute.EMPTY;
        System.out.println("Thread complite");
    }
}

class Attribute {
    public final static Attribute EMPTY = new Attribute();
    
    private Attribute() {
        System.out.println("Constructor running");
        for(int i = 0; i < 10; i++) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
        System.out.println("Constructor complite");
    }
    
}


В результате:
Цитата

Thread running
Thread running
Constructor running
Constructor complite
Thread complite
Thread complite


Т.е. конструктор был вызвал всего один раз. Следовательно, static инициализатор был синхронизирован java runtime системой. 
Думаю, что все нормально.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
shimopus
Дата 11.12.2006, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 25.8.2006

Репутация: 1
Всего: 1



Объект Attribute.EMPTY будет создан только один раз. Но ссылка, которая будет и в SomeA и в SomeB одинаковая, следовательно может возникнуть проблема доступа к этому объекту. Т.е. SomeA, например, будет писать, а SomeB в это время читать. Поэтому места, где будет производится работа с этим объектом в коде надо помечать как 
Код

synchronized

PM ICQ Skype GTalk   Вверх
UnicornMirage
Дата 11.12.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 15.11.2005

Репутация: 1
Всего: 1



Цитата
 Вот поставил эксперимент: 


я тоже ставил подобный эксперимент, но мне кажется он не моделирует реальную ситуацию т.к. потоки создаются в одном месте последовательно...

Цитата

Объект Attribute.EMPTY будет создан только один раз. Но ссылка, которая будет и в SomeA и в SomeB одинаковая, следовательно может возникнуть проблема доступа к этому объекту. Т.е. SomeA, например, будет писать, а SomeB в это время читать. Поэтому места, где будет производится работа с этим объектом в коде надо помечать как 


хм... но ведь ссылка помечена как final поэтому ее изменять объекты не смогут. а вообще в своей программе мне не нужно менять ссылку, а только лишь использовать единственный экземпляр класса...

почитал тему static это хорошо или плохо которая возбудила некоторые сомнения в моем способе организации констант.
PM MAIL   Вверх
powerOn
Дата 11.12.2006, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(UnicornMirage @  11.12.2006,  11:58 Найти цитируемый пост)
т.к. потоки создаются в одном месте последовательно...

Ну и что? Задержка в конструкторе и моделирует реальную ситуацию... Где еще может быть не атомарная операция? 



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
UnicornMirage
Дата 11.12.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 15.11.2005

Репутация: 1
Всего: 1



хорошо! а тогда почему много существует статей и мнений насчет синхронизации создания синглетона если:

Цитата
Следовательно, static инициализатор был синхронизирован java runtime системой. 


кстати, интересно, а каким образом она синхронизирует? 

Это сообщение отредактировал(а) UnicornMirage - 11.12.2006, 12:51
PM MAIL   Вверх
chief39
Дата 11.12.2006, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



static один в пределах JRE для конкретной static переменной.
И инициализируется при первом обращении и загрузке класса.

Цитата(UnicornMirage @  11.12.2006,  12:20 Найти цитируемый пост)
кстати, интересно, а каким образом она синхронизирует? 

То есть не загружает два раза класс в память.

То есть класс(и, соответственно, static) - один на JRE.

Правда.. Если используются несколько класслоадеров.... ;)
Но это не общий случай.

С созданием твоего финал статика - ноу проблем.
Тут не волнуйся.

А вот с использованием....
final гарантирует только то, что 
Цитата(UnicornMirage @  11.12.2006,  00:47 Найти цитируемый пост)
public final static Attribute EMPTY

будет указывать на конкретный объект, созданный при инициализации.
Но вот внутреность объекта можно будет менять всем, кто получит ссылку на него(и A, и B...)

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






--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
UnicornMirage
Дата 11.12.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 15.11.2005

Репутация: 1
Всего: 1



насчет того что нужно ли синхронизировать доступ к переменной EMPTY - внутри моего класса Attribute есть только один метод и нет внутренних переменных кроме как ссылки на самого себя, поэтому наверное синхронизация не нужна в данном случае.

вот полный код класса:

Код

class Attribute {
    public final static Attribute EMPTY = new Attribute();

    private Attribute () {
    }


    public void someMethod(SomeObject arg) {
           //{{ change arg
                ...
           //}}
    }
}


всё понял, спасибо за разъяснение! smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1832 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.