powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Непонятная работа синглтона
12 сообщений из 12, страница 1 из 1
Непонятная работа синглтона
    #34911254
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть некий синглтон, который хранит состояние (state):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 public   class  Single {
	 private   static  Single instance;
	 private   boolean  state;

	 private  Single() {
		state = true;
	}

	 public  sinchronized  static  Single getInstance() {
		 if  (instance ==  null ) instance =  new  Single();
		 return  instance;
	}

	 public   void  setState( boolean  state) {
		 this .state = state;
	}

	 public   boolean  getState() {
		 return   this .state;
	}
}

При некоем действии (допустим, на сайт/страничку зашел новый пользователь) - из сервлета - было изменено состояние синглтона: Single.setState(false).

Для отслеживания состояния есть Runnable класс (также он хранит ссылки на всех слушателей, которых надо будет оповестить об изменившемся состоянии), в котором постоянно проверяется состояние синглтона и если изменилось - производить дальнейшие действия (dispatchUpdate). Например:

Код: plaintext
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.
32.
33.
34.
35.
 public   class  MyVerificator  implements  Runnable {
	 private   static  MyVerificator instance =  new  MyVerificator();
	 private  Set<MyListener> listeners =  new  HashSet<MyListener>();

	 private  MyVerificator() {
		 new  Thread( this ).start();
	}

	 public   static  MyVerificator getInstance() {
		 return  instance;
	}

	 public   void  run() {
		 try  {
			 while  (true) {
				 if  (![color=red]Single.getInstance().getState()[/color])
					dispatchUpdate();
			}
		}  catch  (Exception exception) {}
	}

	 public   void  addListener(MyListener listener) {
		 synchronized (listeners) {
			listeners.add(listener);
		}
	}

	 private   void  dispatchUpdate() {
		 synchronized (listeners) {
			 for  (MyListener listener : listeners) {
				listener.onChange();
			}
		}
	}
}

Вопрос состоит в следующем: при изменении флага в синглтоне мой верификатор не определяет это изменение (выделено красным). Насколько я понимаю, принцип синглтона и состоит в том, что может существовать только один экземпляр этого класса. Если говорить простым языком, то все другие классы работают с ним как с переменной, значение которой едино для всех и на любой стадии. Так ли это? В чем может состоять моя ошибка?
...
Рейтинг: 0 / 0
Непонятная работа синглтона
    #34911303
MikeGolovanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Применение синглетона в J2EE не есть хорошая практика.
Погуглите по ключевым словам J2EE singleton
Коротко аргументы приведены тут
...
Рейтинг: 0 / 0
Непонятная работа синглтона
    #34911321
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruckВопрос состоит в следующем: при изменении флага в синглтоне мой верификатор не определяет это изменение (выделено красным). Насколько я понимаю, принцип синглтона и состоит в том, что может существовать только один экземпляр этого класса. Если говорить простым языком, то все другие классы работают с ним как с переменной, значение которой едино для всех и на любой стадии. Так ли это? В чем может состоять моя ошибка?
Дебагом не пробовали? Breakpoint расставить в контрольных точках?
...
Рейтинг: 0 / 0
Непонятная работа синглтона
    #34911342
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeGolovanovПрименение синглетона в J2EE не есть хорошая практика.
Погуглите по ключевым словам J2EE singleton
Коротко аргументы приведены тут
Ерунда. В чистом EJB нельзя добится поведения singleton. Это да. Singleton в целом плохая практика. Это тоже да. А относительно J2EE в целом, это фигня. Можно и многие к сожалению пользуются. Тут вообще много к чему можно придратся. Дополнительный поток вместо wait/notify постоянно молотит холостой цикл, сажая ресурсы CPU на эту ерунду.
С тем же успехом можно значения и в ServletContext помещать.
...
Рейтинг: 0 / 0
Непонятная работа синглтона
    #34911345
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шутишь, да? :)

Single.getInstance().getState() получает состояние на момент запуска рунейбл-класса (по крайней мере). Думаю, я могу не до конца понимать смысл и назначение синглтона, за чем и обратился в форум.

Как альтернатива: мне нужна некая сущность, которая бы могла хранить состояние (флаги, набор переменных "для всех", пр.) - ну не читать и записывать же постоянно файл на сервере с состояниями - с таким циклом и количеством посещений в винте можно будет дырку сделать :)
...
Рейтинг: 0 / 0
Непонятная работа синглтона
    #34911376
Фотография Софтверный проктолог
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это называется «Накуя козе баян»?
Если уж начали через задницу делать — постелите соломки:
Код: plaintext
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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
 public   class  MyVerificator  implements  Runnable {
	 private   static  MyVerificator instance =  new  MyVerificator();
	 private  Set<MyListener> listeners =  new  HashSet<MyListener>();

	 private  MyVerificator() {
		 new  Thread( this ).start();
	}

	 public   static  MyVerificator getInstance() {
		 return  instance;
	}

        private   static   boolean  changed = false;
        public   static   void  changeState() {
          this .changed = true;
       }

	 public   void  run() {
		 try  {
			 while  (true) {
                                Thread.sleep( 100 );
				 if  (changed )
					dispatchUpdate();
			}
		}  catch  (Exception exception) {}
	}

	 public   void  addListener(MyListener listener) {
		 synchronized (listeners) {
			listeners.add(listener);
		}
	}

	 private   void  dispatchUpdate() {
		 synchronized (listeners) {
			 for  (MyListener listener : listeners) {
				listener.onChange();
			}
		}
	}
}

Синглтоны пошел вкрячивать...
Ужоснах...
...
Рейтинг: 0 / 0
Непонятная работа синглтона
    #34911857
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruck
Как альтернатива: мне нужна некая сущность, которая бы могла хранить состояние (флаги, набор переменных "для всех", пр.) - ну не читать и записывать же постоянно файл на сервере с состояниями - с таким циклом и количеством посещений в винте можно будет дырку сделать :) Может есть смысл сделать через ServletContext + ServletContextAttributeListener?
...
Рейтинг: 0 / 0
Непонятная работа синглтона
    #34925287
Фотография Java Programmer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruckЕсть некий синглтон, который хранит состояние (state):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 public   class  Single {
	 private   static  Single instance;
	 private   boolean  state;

	 private  Single() {
		state = true;
	}

	 public  sinchronized  static  Single getInstance() {
		 if  (instance ==  null ) instance =  new  Single();
		 return  instance;
	}

	 public   void  setState( boolean  state) {
		 this .state = state;
	}

	 public   boolean  getState() {
		 return   this .state;
	}
}

При некоем действии (допустим, на сайт/страничку зашел новый пользователь) - из сервлета - было изменено состояние синглтона: Single.setState(false).

Для отслеживания состояния есть Runnable класс (также он хранит ссылки на всех слушателей, которых надо будет оповестить об изменившемся состоянии), в котором постоянно проверяется состояние синглтона и если изменилось - производить дальнейшие действия (dispatchUpdate). Например:

Код: plaintext
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.
32.
33.
34.
35.
 public   class  MyVerificator  implements  Runnable {
	 private   static  MyVerificator instance =  new  MyVerificator();
	 private  Set<MyListener> listeners =  new  HashSet<MyListener>();

	 private  MyVerificator() {
		 new  Thread( this ).start();
	}

	 public   static  MyVerificator getInstance() {
		 return  instance;
	}

	 public   void  run() {
		 try  {
			 while  (true) {
				 if  (![color=red]Single.getInstance().getState()[/color])
					dispatchUpdate();
			}
		}  catch  (Exception exception) {}
	}

	 public   void  addListener(MyListener listener) {
		 synchronized (listeners) {
			listeners.add(listener);
		}
	}

	 private   void  dispatchUpdate() {
		 synchronized (listeners) {
			 for  (MyListener listener : listeners) {
				listener.onChange();
			}
		}
	}
}

Вопрос состоит в следующем: при изменении флага в синглтоне мой верификатор не определяет это изменение (выделено красным). Насколько я понимаю, принцип синглтона и состоит в том, что может существовать только один экземпляр этого класса. Если говорить простым языком, то все другие классы работают с ним как с переменной, значение которой едино для всех и на любой стадии. Так ли это? В чем может состоять моя ошибка?

Ошибка прежде всего в том что каждый тред - хранит слепок объекта на определенный момент - если хотите этого избежать то надо объявить переменную volatile (это самое простое)
...
Рейтинг: 0 / 0
Непонятная работа синглтона
    #34925312
Фотография Java Programmer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruckШутишь, да? :)

Single.getInstance().getState() получает состояние на момент запуска рунейбл-класса (по крайней мере). Думаю, я могу не до конца понимать смысл и назначение синглтона, за чем и обратился в форум.

Как альтернатива: мне нужна некая сущность, которая бы могла хранить состояние (флаги, набор переменных "для всех", пр.) - ну не читать и записывать же постоянно файл на сервере с состояниями - с таким циклом и количеством посещений в винте можно будет дырку сделать :)

Не понял - а почему не делать это в базе??
Почему не сохранять состояния в базе???
...
Рейтинг: 0 / 0
Непонятная работа синглтона
    #34926429
Kartas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Java Programmer
Не понял - а почему не делать это в базе??
Почему не сохранять состояния в базе???

Ну вообще в базе дорого хранить такие вещи. Много накладных расходов.
...
Рейтинг: 0 / 0
Непонятная работа синглтона
    #34926436
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень много обращений и опросов. Не хочу нагружать. Так сказать, оптимизация процесса - быстро, дешево и стильно :)
Спасибо товарищу выше (Софтпроктологу) - подсказал направление, так действительно лучше. Но без синглтона не обойтись - руннейбл должен быть один, а обращаются разные слушатели, нельзя их плодить.
...
Рейтинг: 0 / 0
Непонятная работа синглтона
    #34926444
Kartas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IDVsbruckОчень много обращений и опросов. Не хочу нагружать. Так сказать, оптимизация процесса - быстро, дешево и стильно :)
Спасибо товарищу выше (Софтпроктологу) - подсказал направление, так действительно лучше. Но без синглтона не обойтись - руннейбл должен быть один, а обращаются разные слушатели, нельзя их плодить.

кстати интересная ветка тут
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Непонятная работа синглтона
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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