On Thursday 03 of November 2005 18:08, Martin Kuba wrote:
> Burdik Petr wrote:
> > Nejsem si ale jist co se stane, kdyz danou metodu singletonu zavolaji
> > dva ruzne jine objekty najednou. Jestli se provede napred pro jednoho a
> > pak pro druheho a nedojde tedy ke zdvojeni uid. Tedy kdyz zavola nekdo
> > metodu securityManagera addUser(User user).
>
> To, co řešíte, je v informatice známo jako problém vzájemného
> vyloučení, anglicky "mutual exclusion". Má víc řešení,
> v jazyce Java se používají tzv. monitory, reprezentované
> bloky
>
> synchronized(objekt) {
> ... kritická sekce kde smí být je jedno vlákno ...
> }
Jenom doplnim, ze v Jave se v distribuovanem prostredi s uspechem pouziva
nekolik reseni:
- JMS queue a v onMessage() pak synchronizovany blok
- synchronizovane EJB Counter ;-)
- a spousta dalsich reseni postavenych na principu klient-server :-D
- lze vyuzit exkluzivitu JNDI bindu: neni mozne bindnout jiz bindnutou
hodnotu, je treba rebind. V tomto pripade seqence
bind(lock)->get(value)->value++->rebind(value)->unbind(lock) funguje jako
atomicky "take" znamy ze spaceovych systemu (TupleSpace, Jini,STITCH,...)
Nelze-li pouzit centralizovanou spravu, pak lze pouzit nektery z klasickych
algoritmu pro volbu vedouciho a toho pak docasne prohlasit za centralu.
--
Oto 'tapik' Buchta, [EMAIL PROTECTED]
Senior Engineer, Systinet Corp,
http://www.systinet.com