![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| nevermind |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 15.5.2004 Репутация: нет Всего: нет |
Я в последнее время все чаще использую static методы и переменные.
Так вообще можно программировать? Не принесет ли мне это каких нибудь неприятных сюрпризов? |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
В каком смысле сюрпризов?
Так что в разумное мере - статик ОК -------------------- |
|||
|
||||
| TrivialCore |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 242 Регистрация: 26.4.2004 Репутация: 2 Всего: 5 |
Можно... но только осторожно =)
Я думаю, безопасно было бы сказать следующее: если можешь обойтись без статической переменной - обойдись без нее. В мире вещей ведь тоже мало качеств общих для всей категории. Естественно, это не касается public final static. |
|||
|
||||
| igon |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 30.10.2004 Репутация: 1 Всего: 21 |
Под нехорошими вещами, если я правильно понял, подразумевается коллизия доступа к общему ресурсу, т.е., например, записанное в данном треде в static поле значение может там и не сохраниться, так как писать в поле могут и другие треды? Но это возможно и в случае одного треда, если будут использованы несколько экземпляров, пишущих и читающих одну и ту же static переменную в произвольной последовательности. static переменные - это, в некотором роде (или не более чем?), глобальные переменные в рамках данного активного приложения. ИМХО, нехорошие вещи могут возникнуть не потому, что статик переменные не являются тред-сейф, а в случае, если отдельный экземпляр рассматривает глобальную переменную как монопольную, доступную только ему область памяти, что, естественно, некорректно. А вот если в static (глобальных) переменных хранить только глобальный контекст, то никаких проблем даже при массовом использовании static вроде бы возникнуть не должно. -------------------- Хотите поговорить об этом? |
|||
|
||||
| Domestic Cat |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Коллижн треда с самим собой? Такогo нe бываеt.
экземпляр рассматривать ничего нe может, у него мозгов нет. Рассматриваеt программер, ну а тут понятно, чтo нужнo помнить, что поле статическое.
возникнут в мультитредовом приложении, независимo оt контекста -------------------- |
||||||
|
|||||||
| igon |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 30.10.2004 Репутация: 1 Всего: 21 |
А как же тогда с этим бороться? Удастся ли проблем избежать, если, скажем, объявлять static поля private и использовать только synchronized методы доступа к ним? Или есть и другие подводные камни? Нельзя ли тогда поподробнее о механизмах возникновения проблем или ссылку на соответствующий материал? -------------------- Хотите поговорить об этом? |
|||
|
||||
| TrivialCore |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 242 Регистрация: 26.4.2004 Репутация: 2 Всего: 5 |
|
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 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 -------------------- |
|||
|
||||
| 3,14 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1614 Регистрация: 18.6.2004 Где: Н. Новгород Репутация: 6 Всего: 24 |
У меня только один раз возникла проблема с static когда статический класс имплементировал некий интерфейс, вот тогда при работе с этим интерфейсом возникли проблемы.
-------------------- Может быть, это только мой бред, Может быть, жизнь не так хороша, Может быть, я не выйду на свет, Но я летал, когда пела душа... |
|||
|
||||
| igon |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 30.10.2004 Репутация: 1 Всего: 21 |
Domestic Cat, спасибо! Сходил по ссылке - и все стало на свои места.
-------------------- Хотите поговорить об этом? |
|||
|
||||
| VSergeyV |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 299 Регистрация: 9.5.2006 Где: Новосибирск Репутация: нет Всего: 3 |
Как static методы сочетаются c многопоточностью и с J2EE? Можно вызывать static методы классов из EJB, Messages Lisneter? //при условии что неиспользуются static поля Это сообщение отредактировал(а) VSergeyV - 14.7.2008, 14:25 |
|||
|
||||
| Shurr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 24.10.2006 Репутация: 5 Всего: 7 |
Если рассматривать только методы, не использующие static поля - то нормально. В принципе и в J2EE можно использовать static поля, просто надо точно понимать, почему именно спецификация это дело не рекомендует, и каким боком это может вылезти. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |