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+).
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.
--
Kamil Podlesak <[EMAIL PROTECTED]>