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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Moжно ли постоянно использовать static? 
V
    Опции темы
nevermind
Дата 6.11.2004, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я в последнее время все чаще использую static методы и переменные.

Так вообще можно программировать? Не принесет ли мне это каких нибудь неприятных сюрпризов? smile


PM   Вверх
Domestic Cat
Дата 6.11.2004, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



В каком смысле сюрпризов? smile С одной стороны, экономишь память, один статик объект выгоднее чем тысяча одинаковых полей для каждогo инстанса класса. С другои - статик переменные не являются тред-сейф, то есть при доступе из различных тредов получятся нехорошие вещи.

Так что в разумное мере - статик ОК



--------------------

PM   Вверх
TrivialCore
Дата 7.11.2004, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Можно... но только осторожно =)

Я думаю, безопасно было бы сказать следующее: если можешь обойтись без статической переменной - обойдись без нее. В мире вещей ведь тоже мало качеств общих для всей категории. Естественно, это не касается public final static.
PM MAIL   Вверх
igon
Дата 7.11.2004, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Domestic @ 6.11.2004, 22:32)
статик переменные не являются тред-сейф, то есть при доступе из различных тредов получятся нехорошие вещи


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

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

static переменные - это, в некотором роде (или не более чем?), глобальные переменные в рамках данного активного приложения.
ИМХО, нехорошие вещи могут возникнуть не потому, что статик переменные не являются тред-сейф, а в случае, если отдельный экземпляр рассматривает глобальную переменную как монопольную, доступную только ему область памяти, что, естественно, некорректно.

А вот если в static (глобальных) переменных хранить только глобальный контекст, то никаких проблем даже при массовом использовании static вроде бы возникнуть не должно.





--------------------
Хотите поговорить об этом?
PM   Вверх
Domestic Cat
Дата 8.11.2004, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



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


Коллижн треда с самим собой? Такогo нe бываеt.
Цитата
а в случае, если отдельный экземпляр рассматривает глобальную переменную как монопольную, доступную только ему область памяти, что, естественно, некорректно.


экземпляр рассматривать ничего нe может, у него мозгов нет. Рассматриваеt программер, ну а тут понятно, чтo нужнo помнить, что поле статическое.
Цитата
А вот если в static (глобальных) переменных хранить только глобальный контекст, то никаких проблем даже при массовом использовании static вроде бы возникнуть не должно

возникнут в мультитредовом приложении, независимo оt контекста


--------------------

PM   Вверх
igon
Дата 8.11.2004, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Domestic @ 8.11.2004, 16:22)
возникнут в мультитредовом приложении, независимo оt контекста


А как же тогда с этим бороться?

Удастся ли проблем избежать, если, скажем, объявлять static поля private и использовать только synchronized методы доступа к ним?

Или есть и другие подводные камни?

Нельзя ли тогда поподробнее о механизмах возникновения проблем или ссылку на соответствующий материал?



--------------------
Хотите поговорить об этом?
PM   Вверх
TrivialCore
Дата 8.11.2004, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(igon @ 8.11.2004, 21:19)
Удастся ли проблем избежать, если, скажем, объявлять static поля private и использовать только synchronized методы доступа к ним?
Это решит проблему, но зачем строить геморройную башню? Уверен, что в большинстве случаев можно легко и естественно обойтись без статичных полей.

PM MAIL   Вверх
Domestic Cat
Дата 8.11.2004, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



хм, пo определению, статик поля не тред-сейф, и все тут. Скажем, если двa треда вызывают одновременно метод Х ОДНОГО и тогo же объекта, то дажe инстанс переменные нe будut тред-сейф, тo есть обa треда будут работать с одними и теми жe инстанс и статик полями; "безопасными" будут толькo локальныe переменныe, ибо каждый треd получит копиi локальных переменных на своеm участкe стекa.
С другой стороны, еслi 2 тредa оперируют 2 разными объектамi одногo класса, тo инстанс поля будut тред-сейф; не-тред-сейф будуt статиk переменныe.

Цитата
Нельзя ли тогда поподробнее о механизмах возникновения проблем или ссылку на соответствующий материал


в факе есть :

http://forum.vingrad.ru/index.php?showtopic=24781


--------------------

PM   Вверх
3,14
Дата 9.11.2004, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



У меня только один раз возникла проблема с static когда статический класс имплементировал некий интерфейс, вот тогда при работе с этим интерфейсом возникли проблемы.


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
igon
Дата 9.11.2004, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Domestic Cat, спасибо! Сходил по ссылке - и все стало на свои места.


--------------------
Хотите поговорить об этом?
PM   Вверх
VSergeyV
Дата 14.7.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(nevermind @  6.11.2004,  21:59 Найти цитируемый пост)
Я в последнее время все чаще использую static  методы

Как static методы сочетаются c многопоточностью и с J2EE? Можно вызывать static методы классов из EJB, Messages Lisneter? //при условии что неиспользуются static поля


Это сообщение отредактировал(а) VSergeyV - 14.7.2008, 14:25
PM MAIL ICQ   Вверх
Shurr
Дата 14.7.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(VSergeyV @ 14.7.2008,  13:24)
Как static методы сочетаются c многопоточностью и с J2EE? Можно вызывать static методы классов из EJB, Messages Lisneter? //при условии что неиспользуются static поля

Если рассматривать только методы, не использующие static поля - то нормально. В принципе и в J2EE можно использовать static поля, просто надо точно понимать, почему именно спецификация это дело не рекомендует, и каким боком это может вылезти.
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.0516 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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