Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Непонятная работа синглтона / 12 сообщений из 12, страница 1 из 1
01.11.2007, 18:15:09
    #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
01.11.2007, 18:30:07
    #34911303
MikeGolovanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятная работа синглтона
Применение синглетона в J2EE не есть хорошая практика.
Погуглите по ключевым словам J2EE singleton
Коротко аргументы приведены тут
...
Рейтинг: 0 / 0
01.11.2007, 18:36:19
    #34911321
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятная работа синглтона
IDVsbruckВопрос состоит в следующем: при изменении флага в синглтоне мой верификатор не определяет это изменение (выделено красным). Насколько я понимаю, принцип синглтона и состоит в том, что может существовать только один экземпляр этого класса. Если говорить простым языком, то все другие классы работают с ним как с переменной, значение которой едино для всех и на любой стадии. Так ли это? В чем может состоять моя ошибка?
Дебагом не пробовали? Breakpoint расставить в контрольных точках?
...
Рейтинг: 0 / 0
01.11.2007, 18:41:34
    #34911342
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятная работа синглтона
MikeGolovanovПрименение синглетона в J2EE не есть хорошая практика.
Погуглите по ключевым словам J2EE singleton
Коротко аргументы приведены тут
Ерунда. В чистом EJB нельзя добится поведения singleton. Это да. Singleton в целом плохая практика. Это тоже да. А относительно J2EE в целом, это фигня. Можно и многие к сожалению пользуются. Тут вообще много к чему можно придратся. Дополнительный поток вместо wait/notify постоянно молотит холостой цикл, сажая ресурсы CPU на эту ерунду.
С тем же успехом можно значения и в ServletContext помещать.
...
Рейтинг: 0 / 0
01.11.2007, 18:42:51
    #34911345
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятная работа синглтона
Шутишь, да? :)

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

Как альтернатива: мне нужна некая сущность, которая бы могла хранить состояние (флаги, набор переменных "для всех", пр.) - ну не читать и записывать же постоянно файл на сервере с состояниями - с таким циклом и количеством посещений в винте можно будет дырку сделать :)
...
Рейтинг: 0 / 0
01.11.2007, 18:52:11
    #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
02.11.2007, 06:58:56
    #34911857
vas0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятная работа синглтона
IDVsbruck
Как альтернатива: мне нужна некая сущность, которая бы могла хранить состояние (флаги, набор переменных "для всех", пр.) - ну не читать и записывать же постоянно файл на сервере с состояниями - с таким циклом и количеством посещений в винте можно будет дырку сделать :) Может есть смысл сделать через ServletContext + ServletContextAttributeListener?
...
Рейтинг: 0 / 0
08.11.2007, 14:51:14
    #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
08.11.2007, 14:55:56
    #34925312
Java Programmer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятная работа синглтона
IDVsbruckШутишь, да? :)

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

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

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

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

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


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