[ RMAN @ 11.05.2010. 23:29 ] @
Radim na jednom programu koji predstavlja komunikaciju klijent-server. Program radi na sledeci nacin: klijent posalje neki podatak preko porta server prima taj podatak i stvara novu nit. Ta nit obradjuje podatak i salje nazad klijentu. Ali u nitima radim i sa fajlovima. Hteo sam da rad sa fajlovima(upis,citanje) stavim u posebnu klasu i da ona bude singleton klasa da ne bi slucajno neki klijent pristupio nekom fajlu dok on ne bude prethodno zatvoren.

Sad mene zanima da ako napravim tu singleton klasu i instanciram je u jednoj niti da li ce ta klasa moci da se instancira u drugoj niti dok ova prva nije zavrsena ili se svaka druga nit zaustavlja na mestu instanciranja sve dok se prva ne zavrsi?
[ del-boy @ 12.05.2010. 02:27 ] @
Singleton ti obezbeđuje samo da imaš jednu instancu klase, ali više niti može da ima referencu na tu jednu instancu i da poziva njene metoda kad joj se ćefne (kad dođe na red da se izvršava).

Ono što treba da uradiš je da tu singleton klasu u kojoj radiš sa fajlovima napraviš tako da bude threadsafe, odnosno da određene delove koda ne može više niti istovremeno da poziva.

Jedan način da ovo uradiš je da kad jedna nit krene nešto da menja zaključaš sve ostale dok prva ne završi, pa kad ona završi upišeš sve promene u fajl i omogućiš ostalim nitima da rade dalje.

Drugi, bolji, način je da zaključavaš samo delove koda kad se podaci menjaju, a ne i sam upis u fajl, pa u jednom trenutku sve odjednom upišeš u fajl (bilo nakon isteka nekog vremena ili nakon određenog broja promena ili nešto treće). Sam upis u fajl može da ti radi posebna klasa (koja isto može biti nit) i koju će tvoja singleton klasa pozivati kad odluči da tako treba (i poslati joj koje promene su urađena, da zna šta da piše u fajl), a ona sama će i dalje raditi nesmetano i pružati servis drugim nitima koje hoće da promene podatke (podrazumeva se da nakom pozivanja niti za upis u fajl resetuješ strukturu podataka u kojoj čuvaš izmene i tako to :) ).
[ del-boy @ 12.05.2010. 02:45 ] @
Sad videh na kom si faxu i koji projekat radiš (pretpostavljam da je web programiranje, pošto mi to jedino ima smisla :) ).

Kad sam ja bio treća godina radili smo neku online kladionicu, ali isti fazon. Ovde imaš moj projekat, možda ti pomogne oko nekih stvari. Davno sam ga pisao, ali koliko se sećam konkretnog problema mislim da sam ga rešio na neki gluplji način, posle sam naučio neke stvari :)

Ono što većina uradi na tim projektima je da piše dupli kod za parsiranje protokola koji osmisli (za prvi i drugi deo zadatka, konzolni klijent i tomcat kao klijent za tvoj server), a ja sam kod sebe to rešio malo bolje. Znam da sam tad bio ponosan na ideju i da sam kasnije skontao da to savršeno ima smisla, samo što sam bio mnogo neiskusniji tad :). Ali šta ćeš, čovek se uči dok je živ :)

Inače, ovaj projekat do koga sam ostavio link ima stvari koje bih sad totalno drugačije uradio (verovatno bih ih drugačije uradio i da sam ga pisao par dana nakon što sam ga završio :) ), ali generalno bi trebalo da radi. Na primer baš ovo što si pitao, oko upisa u fajl bih drugačije rešio, malo bolju modularizaciju napravio, ali te stvari sam skontao tek kad sam odslušao neke predmete sa kasnijih godina.

Sve u svemu, srećno :)
[ RMAN @ 12.05.2010. 10:10 ] @
Hvala ti na ovolikom odgovoru, i hvala ti na projektu

Reci mi samo kako da pokrenem ovaj projekat?
[ del-boy @ 12.05.2010. 14:02 ] @
Da, sad se setih, to sam radio na Linuxu, pa sam napravio bash skripte za pokretanje, što ti ne znači mnogo ako si na Windows-u.

Skripte su server.sh i client.sh. Ako ne razumeš šta piše tamo, u suštini dodaj WP.jar u CLASSPATH i server poteraj sa
Code:

java rs.in.delic.WP.Server.Server 9000 1


a klijenta sa
Code:

java rs.in.delic.WP.Client.Client


A za drugi deo zadatka folder Kladionica treba da prebaciš u tomcat-ov webapps direktorijum (konzolni server mora da bude pokrenut, a moguće da ćeš morati da resetuješ tomcat).

Nisam ovo sad probao, pišem ovo po sećanju :)