Bemærk at der i Collections-klassen er static metoder til at wrappe Lists
mv., så de bliver synkroniseret - i stil med:
ArrayList myList = Collections.synchronizedList(new ArrayList);
Dette giver en synkroniseret ArrayList og som - såvidt jeg ved - er
hurtigere end Vector.
/Lars
"Niels Bech Nielsen" <nbn@logical.nospam.dk> skrev i en meddelelse
news:ovbsa9.jte.ln@java.logical.dk...
> Hvis en tråd kalder en metode, ekskverer tråden denne metode, returnerer
og
> fortsætter.
>
> Problemerne starter, hvis der kører to tråde samtidig og de tilgår nogle
> fælles data.
> Midt i udførslen af en tråd, afbrydes denne og en anden tråd får lov til
at
> fortsætte. Hvis de tilfældigvis arbejder på samme data samtidig kan der
> optræde "race-condition".
>
> Forestil dig to tråde, der eksekverer tre linier (meget simpelt scenario,
> men ok). myClass er en reference til samme objekt for de to tråde.
>
> Precondition: myClass.getAnInt() = 4
>
> Tråd_1.doSomething() { Tråd_2.doSomething() {
> int a = myClass.getAnInt(); int b =
> myClass.getAnInt();
> a = a+1; b = b-1;
> myClass.setAnInt(a); myClass.setAnInt(b);
> } }
>
> Hvad er myClass.getAnInt() ??
>
> Prøv samtlige kombinationer af afvikling, og se hvilke resultater du får.
Du
> skulle gerne kunne få 3, 4, og 5, hvoraf 4 burde have været det logisk
> rigtige result (4+1-1 = 4).
>
> Hvis man ikke vil have nogle tråde til at lave noget sådant, vil kan
typisk
> gøre metoderne synkrone. Dvs. at hvis en tråd er inde i doSomething(), vil
> en anden tråd ikke få lov, før den første tråd er færdig. Det betyder
reelt
> set, at tråd 2 må vente lidt, men til gengæld undgåes "race conditions".
>
> Hvis du kun har 1 tråd, som afvikler metoder på en Vector/ArrayList er der
> ikke behov for synkronisering. Hvis du har mere end 1 tråd, skal du være
> meget opmærksom på hvordan det evt. kan gå galt (Det er i orden fx, hvis
de
> andre tråde kun læser størrelsen eller sådan noget). Derfor som
> tommelfingerregel. Er der kun en tråd, som tilgår denne Collection, brug
en
> ArrayList (ikke synkron = hurtigere). Er der mere end en tråd, brug en
> Vector (synkron = robust). Bemærk, at det kun er visse former for
> race-conditions der umiddelbart undgåes på denne måde. Multi-trådet
> applikationer er altid "svære" at lave ordentligt.
>
> /Niels
>
> --
> /Niels Bech Nielsen -- Logical
> SCJ2P - ** Sun Certified Java 2 Programmer **
>
> "Jonas Swiatek" <sxt@get2net.dk> skrev i en meddelelse
> news:3ad1a135$0$5728$4d4eb98e@news.dk.uu.net...
> > Hey igen...
> >
> > Hvad er det helt præsic der er fordelen ved ArrayList, frem for Vector?
> > Hastigheden, eller hvordan?
> >
> > Der står dether med unsynhcronized, og jeg har en tråd, som løbene
kalder
> > metoder, der kalder get, add og remove fra min vectorliste...
> > Når en tråd kalder en metode, forsætter tråden så lige efter, eller
venter
> > den til metoden er færdig?
> >
> > --
> > Jonas
> >
> > Fra: "Niels Bech Nielsen" <nbn@logical.nospam.dk>
> > Emne: Re: Multi-klient server
> > Dato: 9. april 2001 08:18
> >
> > Jamen, det var dog en overskuelig opgave så. Bare husk at DB roundtrips
er
> > lidt iiriterende, og så meget du kan cache som muligt er en fordel.
> >
> > Mht. collections.
> >
> > Collection er et overordnet interface for alle collectioner. Generelt
set
> er
> > der tre typer:
> > Set - Hvor elementer er unikke (matematisk mængde)
> > Map - Hvor et element parres med en nøgle (key-value)
> > List - Hvor elementer specificeres i en rækkefølge.
> >
> > Lists og Sets har add metoder, mens Map typisk har put metoder.
> > Den klasse, der ligner Vector mest (samme type implementering) er
> ArrayList.
> > Kig i den, og følg evt. metoderne baglæns via AbstractList til
> > AbstractCollection. Klassen implementerer både Collection og List
> interfacet
> > (plus Cloneable og Serializable).
> >
> > Klassen Collections (bemærk s'et i enden) er en støtte klase til de
> > forskellig Collection klasser. Den indeholder lidt søgning og sortering,
> > samtidig med at den definerer nogle constante typer, som EMPTY_LIST,
> > EMPTY_SET, og EMPTY_MAP som kan spare en at oprette tomme collectioner.
> >
> > Jeg kan iøvrigt anbefale, at man lige løber følgende igennem:
> >
http://www.javasoft.com/docs/books/tutorial/collections/index.html
> >
> > En udemærket lille tutorial om dette.
> >
> > /Niels
> >
> > --
> > /Niels Bech Nielsen -- Logical
> > SCJ2P - ** Sun Certified Java 2 Programmer **
> >
> > "Jonas Swiatek" <sxt@get2net.dk> skrev i en meddelelse
> > news:9aq86o$dtr$1@news.cybercity.dk...
> > > Serveren kommer nok maks op på en 1-300 connections, lige det første
> > stykke
> > > tid.
> > >
> > > Og de ting d transmiteres er f.eks: 1,move,3
> > > Eller: 1,talk,2,du stener!
> > > Alt dette bliver slipttet op i en StringTokenizer.
> > >
> > > Der skal for 80% af kommandoernes vedkommende, måske tjekkes noget i
en
> > > database.
> > >
> > > Hvordan virker collections?
> > > Jeg kan hverken finde add, remove eller andre metoder, som minder om
> > > Vectoren?
> > >
> > > --
> > > Jonas
> > >
> > > "Niels Bech Nielsen" <nbn@logical.nospam.dk> skrev i en meddelelse
> > > news:mjdha9.2df.ln@java.logical.dk...
> > > > Hej,
> > > >
> > > > Nu har jeg set en række indlæg på dit spørgsmål, og vil da også
gerne
> > give
> > > > en kommentar med på vejen (Når du endeligt er et "rigtigt"
spørgsmål).
> > > >
> > > > Jeg har spekuleret lidt i forskellige scenarier, og kan ikke komme
med
> > > noget
> > > > entydigt bud, når jeg ikke kender omfanget af data, der skal
> > kommunikeres
> > > og
> > > > graden af samtidighed systemet skal understøtte (for en eller flere
> > > > brugere).
> > > >
> > > > Du skal nok spekulere på om det skal være connection-oriented
> > (tcp/socket)
> > > > eller connection-less (udp/datagram), da det kan give store
forskelle
> > mht
> > > > til workload.
> > > >
> > > > Du kan evt. også vælge en hybridløsning, hvor man etablere en socket
> > > mellem
> > > > klient og server, men også signalerer med datagrammer.
> > > >
> > > > Serveren kan holde mange connections i en enkelt connection-pool,
hvor
> > > store
> > > > datamængder transmitteres eller kompleks request-respons kan
behandles
> > > (som
> > > > f.eks. flerfaset commit etc), evt. med et acceptabelt overhead.
> > > >
> > > > Derudover kan klienten sende simple kommandoer via udp, som en
server
> > kan
> > > > behandle væsentligt hurtigere (ved f.eks. at flytte kommandoen til
en
> > > > central processing pool). For at sikre pålideligheden i udp kan man
> evt.
> > > ved
> > > > hvert request tilføje et sekvens nummer, og så retransmittere
> kommandoen
> > > et
> > > > par gange med lidt fall-back. Serveren skal så kun acceptere en ny
> > > kommando
> > > > fra en klient, hvis den har højere sekvens nummer (og man kan også
> > > > gennemskue tabte pakker, som evt kan retransmitteres vhja tcp).
> > > >
> > > > Det giver lidt mere arbejde, men bliver bedre performancemæssigt.
> > > >
> > > > Du skal iøvrigt passe på med at bruge Vector klassen. Det er en af
de
> > > værste
> > > > collections vi har i java. Tag et kig på de nye collection
libraries,
> og
> > > > vælg klasser derfra.
> > > >
> > > > Vector og Hashtable lider begge under, at de --altid-- er synkrone
> > udgaver
> > > > (og derved optager lang tid ved hver operation). Derudover tilbyder
de
> > > > elementerne via en Enumeration, som desværre er indeterministisk
over
> > for
> > > > ændringer i collectionen undervejs (Hvad sker der, hvis man sletter
et
> > > > element samtidig med at man enumererer, og særligt det man måske har
> fat
> > i
> > > i
> > > > øjeblikket.
> > > >
> > > > De nye collections er altid usynkrone, men man kan få synkrone
udgaver
> > ved
> > > > at bruge metoder fra "java.util.Collections" klassen (ikke at
> forveksle
> > > med
> > > > konceptet collection).
> > > > Derudover anvender de iteratorer, som tilbyder muligheden for
remove()
> > > > undervejs, og kaster en ConcurrentModificationException hvis
> collection
> > > > ændres imellemtiden).
> > > >
> > > > Der findes i det nye collections biblioteket to andre klasser, der
> > > fungerer
> > > > lige som Vector og Hashtable i adfærd, de hedder ArrayList og
HashMap.
> > > >
> > > > Håber de giver dig lidt at tænke på.
> > > >
> > > > /Niels Bech Nielsen
> > > >
> > > > "Jonas Swiatek" <sxt@get2net.dk> skrev i en meddelelse
> > > > news:9a4ben$1pdi$1@news.cybercity.dk...
> > > > > Hej.
> > > > >
> > > > > Jeg skal lave en server, som kan håndterer flere klienter af gang.
> > > > > Og, det skal være til et spil, så det er hovedsageligt kommandoer
> som
> > > > bliver
> > > > > sendt frem og tilbage.
> > > > >
> > > > > Jeg er lidt på bar bund, med hvordan jeg skal strukturerer det.
> > > > >
> > > > > Nogle der har et bud, eller et eksempel?
> > > > >
> > > > > --
> > > > > Jonas
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
> >
> >
>
>