Kamil Podlesak wrote:
jeeff wrote:
Ahoj,
to je presne jasne aj mne, v povodnom prispevku som pisal ze ako
najjednoduchsie riesenie vidim dat danu metodu synchronized. Chcel som
len vediet, ci je to spravne riesenie, alebo pouzivate nejaky iny
postup.
Dat danou metodu synchronized neni spravne reseni, je to hack a
skutecne je nebezpecny (viz dale).
Staci synchronizovat jen nezbytne nutnou sekci:
synchronized (nakupBean) {
if (nakupBean.isStornovany()) return false;
nakupBean.setStornovany(true);
}
Take by slo pouzit java.util.concurrent.AtomicBoolean (java 1.5+).
nad tymto som presne uvazoval, respektive synchronizoval by som to nad
userom co spravil ten nakup. Totiz volanie
nakupBean.setStornovany(true); ja teraz volam az ked zbehne vsetko pred
tym (vratenie penazi na ucet nakupujuceho). Ale teoreticky to mozem
spravit aj takto nazaciatku a keby sa mi z nejakeho dovodu nepodarilo
spravit financnu tranzakciu tak to stornovanie zrusim.
Jiri Mares radil pouzit tranzakcie, tiez su tu rady, ze datovu
konzistenciu ma drzat databaza, ale co ked "vratenie penazi na ucet
nakupujuceho" je nejake XML volanie do banky. Cize sa to neda spravit
ako nejaka databazova tranzakcia, ani to databaza nemoze riesit svojou
konzistenciou.
Bojim sa toho, ze ked z jednej synchronized metody zavolam inu
synchronized metodu ze mi vznikne deadlock, takze preto sa snazim najst
aj ine riesenie.
Deadlock v Jave vznikne jen tak, ze si ruzna vlakna zamknou vice
stejnych monitoru, ale v navzajem ruznem poradi. To se nestane, pokud
jsou synchronized sekce a metody pouzity jen tam kde je to nutne
(datove struktury, operace ktere musi byt atomicke a podobne). V
podstate se to muze stat jenom v pripade, ze se na vice vlaken
vzpomene pozde a do hotoveho kodu se nasazi klicova slovicka
synchronized u tech hlavnich metod (coz je bohuzel tento pripad).
To je to o cem jsem psal - na synchronizaci je nutne myslet stale.
Jedine tak se synchronizuji jen ty opravdu nejmensi nutne useky. A
neni nutne se nejak synchronized vyhybat a pak resit nejake otazky
jako zda ho vyuzit nebo ne... nejde o zadnou cernou magii.
hej, ved prave na tu synchronizaciu myslim, doteraz som to ziadno
neriesil, ale pri financnych operaciach to moze byt problem... Ak by sa
jednalo len o to storno nie je problem ked sa to do databazy zapise aj
10x, ze atribut storno je true. Problem je v tom, ze ked sa vykona
storno vratim peniaze na ucet nakupujuceho a to by som bol nerad, keby
sa niekomu podarilo viac krat.
--
jeeff